Полуночный командующий (mc
) является самым легким, просто укажите на него и поразите F8 ;)
Если все, что Вы хотите сделать, шпионить за существующим процессом, можно использовать 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.
Вы смогли посмотреть на удаленное экранное использование ssh localhost 'DISPLAY=:0.0 xwd -root' | xwud -scale
где localhost
должен быть заменен Вашими данными для входа в систему удаленного сервера и :0.0
с количеством дисплея Вашего GUI.
Использовать x11vnc
, который является сервером VNC для Вашего на экранной X-сессии.
При работе одной из этих 6 попыток виртуальных консолей sudo setterm -dump 2 -file /dev/stdout
, где Вы заменяете 2
с соответствующим vc.
Я советовал бы для создания именованного канала (mkfifo
) и затем запишите в тот файл. Затем читайте из него. Можно всегда делать это с вещами как tail
, минимизировать вывод, и т.д. Каждый раз, когда Вы очищаете канал (чтение от него), это очищено, таким образом, вывод не сохраняется.
Другая опция состояла бы в том, чтобы записать все в файл (во многом как файл журнала) и затем проанализировать его любое время. Это было бы предпочтительным действием, если Вы хотите сохранить весь вывод.
не можете Вы получать идентификатор процесса и общаться с ним с USR1,
$pgrep -l '^ipchecker.sh$'
который печатает PID Вашего сценария, затем используйте его для
$ kill -USR1 PID
Я понимаю, что USR1 является "определяемым пользователем" сигналом, означая, что, кто бы ни создал программу, может использовать его, чтобы означать, что "закрытие" или "выводит Ваши журналы", или "печатают нечто тысячу раз" или что бы то ни было.
В 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
Вы можете получить доступ к выходным данным через файловую систему proc
.
tail -f /proc/<pid>/fd/1
1
= stdout, 2
= stderr
Вы всегда можете запустить процесс с nohup и &
nohup rsync source_file dest_file &
Тогда вы сможете проверить прогресс с любого tty с помощью:
tail -f nohup.out
Для меня это прекрасно работает.
Очень простым способом получения вывода будет захват вашего вывода в файл и отслеживание этого файла.
IF DO: ./ipcheck
INSTEAD DO: ./ipcheck > [replacewithyourfilename]
Это создаст выходной файл, в котором будет находиться ваш скрипт. Затем из любой другой оболочки bash вы можете просто выполнить хвост файла:
tail [replacewithyourfilename] -f
Анализ вывода 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 процесса, новые строки, цвет и все!
В Баш 1:
any_command_you_want > my_output.txt&
В баше 2:
cat my_output.txt
Если вы хотите получить stderr и stdout, вы можете просто запустить это:
tail -f /proc/<pid>/fd/*
Если у вас есть коммерческий LSF от IBM в качестве планировщика заданий, у вас также есть опция
бит отображает вывод stdout и stderr незавершенного задания
bpeek [ -f] [ -q очередь _имя | -м хост _имя | -J задание _имя | работа _ID | "ID задания _[индекс _список]"]
man strace
– Pistos 01.09.2015, 18:32