В дополнение к ответу @ Dave, существует расширенный метод для перенаправления файловых дескрипторов ввода и вывода запущенной программы с использованием GDB.
Пример FreeBSD для произвольного сценария оболочки сPID 4711:
> gdb /bin/sh 4711
...
Attaching to program: /bin/sh, process 4711
...
(gdb) p close(1)
$1 = 0
(gdb) p creat("/tmp/testout.txt",0644)
$2 = 1
(gdb) p close(2)
$3 = 0
(gdb) p dup2(1,2)
$4 = 2
EDIT - объяснение: закрывается файловый дескриптор 1, затем открывается файл, который повторно использует 1. Затем он закрывает файловый дескриптор 2 и дублирует файловый дескриптор 1 до 2.
Теперь этот процесс 'stdout
и stderr
идут к указанному файлу и доступны для чтения оттуда.Если требуется stdin
, вам нужно p close(0)
и затем приложить какой-нибудь входной файл или PIPE или что-то в этом роде.
В настоящее время я не могу найти способ удаленного disown
этого процесса изуправляющий терминал, что означает, что при выходе из терминала этот процесс получает сигнал SIGHUP
.
Примечание: Если у вас есть доступ к другому терминалу или вы получаете его, вы можете disown -a
так что этот процесс будет продолжать выполняться после закрытия терминала.