2013-11-06 1 views
0

У меня есть программа python, работающая на моей университетской машине, и я понял, что ее потребуется больше времени, чем я ожидал. Один цикл кода печатает некоторый вывод. Я хочу сохранить этот вывод в файле, а также отправить текущую программу в фоновом режиме, поскольку мне нужно выйти из системы.отправить запущенную программу на фон и получить вывод в файле

Это (How do I put an already-running process under nohup?) объясняет, как я могу отправить его на задний план. Есть ли способ, по которому я также могу сохранить вывод, который отображается на экране каждую секунду, например, используя tee

+0

Перенаправить вывод в файл и использовать 'tail -f' для чтения файла? Я не знаю, можно ли перенаправить вывод после запуска программы. – rm5248

+0

Я думаю, что это технически возможно, но вовлекает в себя отладчик, чтобы изменить открытые дескрипторы файла текущего процесса. Не для слабонервных и, вероятно, больше проблем, чем того стоит. – chepner

ответ

1

Если программа уже запущена, это вопрос взлома (см. Ниже), чтобы перенаправить его вывод. Вместо этого вы можете/должны принять меры предосторожности заранее.

Мне было очень полезно всегда запускать удаленные команды в сеансе screen. Это позволяет:

  1. Прилагается и отсоединяется к сеансу по желанию и не нарушает работу программ. Это означает, что вы можете отсоединить сеанс, выйти из системы, затем войти в систему позже и найти все свои «окна» и запущенные программы по мере их выхода (или, надеюсь, готовые вычисления). Это также работает, когда ваше ssh-соединение неожиданно отбрасывается, или если вам нужно подключаться из нескольких мест одновременно (например, с вашего собственного ноутбука/машины через ssh и непосредственно из терминала университетской машины);
  2. имеют несколько (текстовый режим) «окна», работающие на одном и том же ssh-соединении, и переключаются между ними (и их выходом) с помощью сочетаний клавиш;
  3. имеют буфер прокрутки для каждого «окна», так что, даже если вы забыли использовать tee, вы можете прокрутить вверх и посмотреть, что напечатала программа;
  4. установить пароль сеанса, чтобы только вы могли подключиться к нему.

О хакерской части:

Если вы застряли работает очень долго и важной программы, и не может перезапустить его, чтобы использовать метод, описанный выше, есть еще надежда.

Дескрипторы открытых файлов для каждого процесса (включая его текущий stdout) можно найти через файловую систему /proc. Используя это, вы можете поменять файловый дескриптор и переключить командный переключатель на выход в другое место на лету. This script (fdswap.sh) использует gdb для замены файлового дескриптора из работающего процесса и there's an article, объясняя, как его использовать.

Вкратце: найдите pid выполняющегося процесса, затем запустите ls -l /proc/$pid/fd/0, чтобы найти, где находится его текущий выход, затем используйте приведенный выше сценарий для его замены: fdswap.sh /dev/pts/$vty /path/to/new/output $pid.

Историческая справка: http://www.phrack.org/issues.html?issue=51&id=5

2

Я не пробовал, но это зло взломать мощь работы.

  1. Найти то, что файл дескрипторы программа использует:

    ls -l /proc/<your-pid>/fd 
    
  2. Присоединить отладчик к процессу (исполняемый файл что-то вроде /usr/bin/python):

    gdb --pid=<your-pid> <executable> 
    
  3. Открыть новый (вам, возможно, придется искать числовые значения O_CREAT и O_WRONLY):

    (gdb) set $newfd = open("myfile", O_CREAT | O_WRONLY) 
    
  4. Замените старый дескриптор файла, который вы нашли на шаге 1, с новым.

    (gdb) call dup2(<old-fd>, $newfd) 
    (gdb) call close($newfd) 
    
  5. Установите программу, работающую снова и отключить отладчик

    (gdb) detach 
    (gdb) quit 
    

Это будет работать только в том случае, если open и dup2 функции присутствуют в программе.

Предупреждение: есть опасность, что это может привести к краху вашей программы!

 Смежные вопросы

  • Нет связанных вопросов^_^