Когда вы запускаете новый эмулятор терминала, он создает новый терминал ( / dev / pts / НОМЕР
в Linux) . Программа не должна запускаться с этого терминала для вывода туда (попробуйте запустить tty
в терминале, затем в другом терминале запустите echo hello> / dev / pts / NUMBER
). Таким образом, вы можете указать своему скрипту Python читать и писать с терминала; все, что вам нужно, это узнать путь к файлу устройства.
С xterm это довольно просто: запустите xterm -e 'tty> & 3; myCommand '
с файловым дескриптором 3, подключенным к каналу, из которого ваша программа считывает путь к оконечному устройству.
p = subprocess.Popen("xterm -e 'tty >&3; exec sleep 99999999' 3>&1",
shell=True, stdout=subprocess.PIPE)
tty_path = readline(p.stdout)
tty = open(tty_path, 'r+')
Ваша программа Python теперь может читать и писать на tty
. Когда вы закончите, закройте эмулятор терминала ( os.kill (p.pid, signal.SIGTERM)
).
С эмулятором терминала, который основан на одном процессе для нескольких окон, например xfce4-terminal, то, что вы хотите сделать, значительно сложнее. Запуск xfce4-terminal
разрывает связи между родительским процессом и дочерним процессом эмулятора терминала и не дает вам хорошего PID, который вы можете убить. Вы можете использовать именованный канал для связи, но его сложнее настроить.
«Предполагаемый» — это суждение.
Команды, вызываемые из /etc/cron.d/
, выполняются от имени указанного пользователя (либо root
, либо любого другого; это определено в строке cron ). Так что обычно в sudo
нет необходимости.
Однако, если у вас действительно есть скрипт, который вызывает sudo
, вам необходимо убедиться, что запись sudoers
верна. В частности:
root
)NOPASSWD
, чтобы ее можно было запускать без ввода пароля.Ошибка, которую вы видите, связана с тем, что для команды sudo
требуется пароль, но нет терминала для его предоставления.
Хорошо написанный скрипт определяет, работает ли он с правильными разрешениями, и вообще не вызывает sudo
, но есть много плохих скриптов:-)