Как просмотреть вывод рабочего процесса на другой сессии удара?

Полуночный командующий (mc) является самым легким, просто укажите на него и поразите F8 ;)

211
15.12.2012, 16:04
12 ответов

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

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

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

Обратите внимание, что в зависимости от того, как Ваша система настраивается, Вы, возможно, должны выполнить все они strace команды как корень, даже если процесс работает при Вашем пользователе без дополнительных полномочий. (Если процесс будет работать как другой пользователь или будет setuid или setgid, то необходимо будет работать strace как корень.) Большинство дистрибутивов только позволяет процессу прослеживать своих детей (это предоставляет умеренное преимущество безопасности — это предотвращает некоторую прямую вредоносную инжекцию, но не предотвращает косвенную инжекцию путем изменения файлов). Этим управляют kernel.yama.ptrace_scome sysctl.

188
27.01.2020, 19:27
  • 1
    , который я не предполагаю, существует способ сузить вывод только к стандартному выводу? –  Jonah 28.03.2013, 02:33
  • 2
    Можно ли объяснить все аргументы? –  User 17.03.2015, 00:15
  • 3
    Было много обратных косых черт и чисел в большом выводе, который я получал от nodejs; Кто-либо вовлекает, в каком кодировании они могли бы быть? Было много простого текста также, который был всем, в чем я нуждался. –  ThorSummoner 16.07.2015, 20:27
  • 4
    "Можно ли объяснить все аргументы?" @User: man strace –  Pistos 01.09.2015, 18:32
  • 5
    @RafaelMoni программа, чтобы сделать, что Вы спрашиваете, называют отладчиком. –  Gilles 'SO- stop being evil' 22.12.2015, 14:12
  1. Вы смогли посмотреть на удаленное экранное использование ssh localhost 'DISPLAY=:0.0 xwd -root' | xwud -scale где localhost должен быть заменен Вашими данными для входа в систему удаленного сервера и :0.0 с количеством дисплея Вашего GUI.

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

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

4
27.01.2020, 19:27

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

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

4
27.01.2020, 19:27

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

$pgrep -l '^ipchecker.sh$'

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

$ kill -USR1 PID

Я понимаю, что USR1 является "определяемым пользователем" сигналом, означая, что, кто бы ни создал программу, может использовать его, чтобы означать, что "закрытие" или "выводит Ваши журналы", или "печатают нечто тысячу раз" или что бы то ни было.

0
27.01.2020, 19:27

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

watch /dev/pts/0

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

Кажется, единственный способ - отладить процесс (например, 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

Проверьте , чтобы прочитать , чтобы узнать о дополнительных параметрах (например, -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 в оболочке в обычный текст? at stackoverflow

10
27.01.2020, 19:27

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

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

1 = stdout, 2 = stderr

151
27.01.2020, 19:27

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

nohup rsync source_file dest_file &

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

tail -f nohup.out

Для меня это прекрасно работает.

3
27.01.2020, 19:27

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

IF DO: ./ipcheck

INSTEAD DO: ./ipcheck > [replacewithyourfilename]

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

tail [replacewithyourfilename] -f

1
27.01.2020, 19:27

Анализ вывода strace:

Я использовал лучший ответ(с моим идентификатором процесса 28223 )...

> sudo strace -p28223 -s9999 -e write
...
write(9, "Info\nI\nCare\nabout", 55) = 55
...

Чтобы определить, что меня волнует write(9. (Ниже используется цифра 9. Вероятно, это дескриптор файла, который может отличаться для вашего процесса. )Затем я написал быстрый Ruby-скрипт для их разбора и отображения.

Вставьте следующее в/usr/bin/parse_strace.rb

#!/usr/bin/ruby

num = ARGV[0]
STDIN.each { |line|
  if (line.match(/write\(#{ num },\s*"(.*?)"/)) then
    puts $1.split('\x').map { |s| s.to_i(16).chr }.join()
  end
}

Не забывайchmod a+x /usr/bin/parse_strace.rb

Я вызываюstrace -xx(выходные данные в шестнадцатеричном формате, поэтому регулярное выражение соответствует правильному ), конвейеру (, включая STDERR ), моему сценарию с 9в качестве первого аргумента.

sudo sh -c 'strace -xx -p28223 -s9999 -e write 2>&1 | parse_strace.rb 9'

И, вуаля, он выводит исходный STDOUT процесса, новые строки, цвет и все!

Attaching to process STDOUT

8
27.01.2020, 19:27

В Баш 1:

any_command_you_want > my_output.txt&

В баше 2:

cat my_output.txt
0
13.07.2020, 06:41

Если вы хотите получить stderr и stdout, вы можете просто запустить это:

tail -f /proc/<pid>/fd/*
1
17.11.2020, 09:28

Если у вас есть коммерческий LSF от IBM в качестве планировщика заданий, у вас также есть опция

бит отображает вывод stdout и stderr незавершенного задания

bpeek [ -f] [ -q очередь _имя | -м хост _имя | -J задание _имя | работа _ID | "ID задания _[индекс _список]"]

0
08.02.2021, 06:33

Теги

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