Как просмотреть вывод текущего процесса в другом сеансе bash?

Я оставил скрипт, запущенный на удаленной машине, с того момента, когда я работал на нем локально. Я могу подключиться через SSH к машине в качестве одного и того же пользователя и увидеть сценарий, выполняющийся в ps.

$ ps aux | grep ipcheck
myuser  18386  0.0  0.0  18460  3476 pts/0    S+   Dec14   1:11 /bin/bash ./ipchecker.sh

Он просто выводит на stdout на локальный сеанс (я запускал ./ipchecker.sh формирует локальное окно терминала, не перенаправляет, не использует экран screen и т. д.)) .

Как бы то ни было, из сеанса SSH я могу просмотреть вывод этой текущей команды (не останавливая ее)?

Пока лучшее, что я нашел, это использовать strace -p 18386, но я получаю орды текста, взлетающие по экрану, слишком подробные. Я могу остановить strace, а затем просеять вывод и найти текст, который выводит на печать в stdout, но очень длинный и запутанный, и, очевидно, пока он остановлен, я могу что-то пропустить. Я хотел бы найти способ увидеть, как работает скрипт, как если бы я работал локально.

Может ли кто-нибудь улучшить это? Очевидным ответом является перезапуск сценария с перенаправлением или в сеансе screen и т. Д., Это не критический сценарий, поэтому я мог бы это сделать. Напротив, я вижу это как забавное учебное упражнение.

150 голосов | спросил jwbensley 15 SatEurope/Moscow2012-12-15T18:04:06+04:00Europe/Moscow12bEurope/MoscowSat, 15 Dec 2012 18:04:06 +0400 2012, 18:04:06

8 ответов


141

Если все, что вы хотите сделать, это шпион по существующему процессу, вы можете использовать strace -p1234 -s9999 -e write, где 1234 - это идентификатор процесса. (-s9999 избегает иметь строки, усеченные до 32 символов, и write системный вызов, который производит вывод.) Если вы хотите просмотреть только данные, написанные на конкретном дескрипторе файла, вы может использовать что-то вроде strace -p1234 -e trace= -e write=3, чтобы видеть только данные, записанные в дескриптор файла 3 (-e trace=) предотвращает loged). Это не даст вам выход, который уже был выпущен.

Если выход прокручивается слишком быстро, вы можете передать его в пейджер, например less, или отправить его в файл с помощью strace -o trace.log ….

Со многими программами вы можете переадресовывать последующий вывод с помощью ptrace hack, либо на ваш текущий терминал, либо на новый сеанс экрана. См. Как я могу отменить запущенный процесс и связать его с новой оболочкой экрана? и другими связанными потоками.

ответил Gilles 16 SunEurope/Moscow2012-12-16T04:23:24+04:00Europe/Moscow12bEurope/MoscowSun, 16 Dec 2012 04:23:24 +0400 2012, 04:23:24
87

Вы можете получить доступ к выходному файлу через файловую систему proc.

tail -f /proc/<pid>/fd/1

1 = stdout, 2 = stderr

ответил tvlooy 8 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 08 Sep 2016 17:19:56 +0300 2016, 17:19:56
6

В BSD вы можете использовать watch который отслеживает заданный tty, например

watch /dev/pts/0

В Linux это будет невозможно, если процесс не запускался в мультиплексоре до того, как screen или tmux. См. Также: Рептыр: Присоединить процесс запуска к новому терминалу

Кажется, единственный способ - отладить процесс (например, strace, dtrace /dtruss, gdb , lldb и т. д.).

Поскольку вы использовали strace, для получения любого значимого результата, вам необходимо отфильтровать с помощью квалификационного выражения (например, file), а затем проанализировать вывод. Вот пример:

strace -e trace=write -s1000 -fp 18386 2>&1 | grep -o '".\+[^"]"'

Что он делает, он печатает операцию записи процесса (длина 1000), заданную PID (используйте pgrep, чтобы найти его по имени), перенаправляет стандартную ошибку в вывод (для фильтрации) и печатает строка с двойными кавычками.

Если вы имеете дело с двоичным выходом, вы можете анализировать символы escape-последовательностей, используя read-r) и printf ( с помощью %b), например

while read -r -t1 line; do printf "%b" $line; done

Проверьте help read для получения дополнительных параметров (например, -n для печати после определенного количества символов, а не новой строки).

Вот более полный пример:

strace -e trace=write -s1000 -fp 18386 2>&1 \
| grep --line-buffered -o '".\+[^"]"' \
| grep --line-buffered -o '[^"]\+[^"]' \
| while read -r line; do
  printf "%b" $line;
done

Для примеров с использованием любого процесса, пожалуйста, проверьте: Как разобрать strace в оболочке в обычный текст? в stackoverflow

ответил kenorb 12 AMpTue, 12 Apr 2016 00:53:29 +030053Tuesday 2016, 00:53:29
4
  1. Возможно, вы сможете заглянуть на удаленный экран, используя ssh localhost 'DISPLAY=:0.0 xwd -root' | xwud -scale, где localhost должен быть заменен учетными данными входа удаленного сервера и :0.0 с отображаемым номером вашего графического интерфейса.

  2. Используйте x11vnc, который является VNC-сервером для вашего X-сеанса на экране.

  3. При запуске на одной из 6 виртуальных консолей попробуйте sudo setterm -dump 2 -file /dev/stdout, где вы заменяете 2 на соответствующий vc .

ответил jippie 15 SatEurope/Moscow2012-12-15T19:27:07+04:00Europe/Moscow12bEurope/MoscowSat, 15 Dec 2012 19:27:07 +0400 2012, 19:27:07
3

Я бы посоветовал создать именованный канал (mkfifo), а затем записать в этот файл. Затем прочитайте это. Вы всегда можете сделать это с помощью таких вещей, как tail, чтобы минимизировать вывод и т. Д. Всякий раз, когда вы очищаете трубу (читаете ее), она очищается, поэтому выход не сохраняется.

Другой вариант - записать все в файл (как и файл журнала), а затем проанализировать его в любое время. Это было бы предпочтительным действием, если вы хотите сохранить весь вывод.

ответил polemon 15 SatEurope/Moscow2012-12-15T18:11:47+04:00Europe/Moscow12bEurope/MoscowSat, 15 Dec 2012 18:11:47 +0400 2012, 18:11:47
1

Вы всегда можете запустить процесс nohup и &

nohup rsync source_file dest_file &

Затем вы можете проверить прогресс с любого tty с помощью:

tail -f nohup.out

Это отлично работает для меня.

ответил Pablo Luna 23 32016vEurope/Moscow11bEurope/MoscowWed, 23 Nov 2016 19:47:48 +0300 2016, 19:47:48
1

Очень просто получить вывод будет захват вашего вывода в файл и хвост этого файла.

ЕСЛИ ДЕЛАТЬ: ./ipcheck

ВМЕСТО ДЕЙСТВИЯ: ./ipcheck> [Replacewithyourfilename]

Это создаст выходной файл, в котором находится ваш скрипт. Затем из любой другой оболочки bash вы можете просто зачеркнуть файл:

tail [replacewithyourfilename] -f

ответил MrAllen 26 PMpWed, 26 Apr 2017 21:08:03 +030008Wednesday 2017, 21:08:03
0

Вы не можете получить идентификатор процесса и связаться с ним с помощью USR1,

$pgrep -l '^ipchecker.sh$'

, который печатает идентификатор PID вашего скрипта, затем используйте его для

$ kill -USR1 PID

Я понимаю, что USR1 является «определяемым пользователем» сигналом, что означает, что тот, кто создал программу, может использовать его для обозначения «shut down» или «dump your logs» или «print foo тысяча раз» или что-то еще.

ответил Saeed 16 SunEurope/Moscow2012-12-16T15:35:30+04:00Europe/Moscow12bEurope/MoscowSun, 16 Dec 2012 15:35:30 +0400 2012, 15:35:30

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132