Я оставил скрипт, работающий на удаленной машине, когда работал на нем локально. Я могу подключиться через SSH к компьютеру от имени того же пользователя и увидеть, как работает скрипт ps
.
$ ps aux | grep ipcheck
myuser 18386 0.0 0.0 18460 3476 pts/0 S+ Dec14 1:11 /bin/bash ./ipchecker.sh
Это просто вывод на стандартный вывод в локальном сеансе (я запускал ./ipchecker.sh
из окна локального терминала, без перенаправления, без использования screen
etc).
Есть ли в любом случае из сеанса SSH я могу просмотреть вывод этой запущенной команды (не останавливая ее)?
Пока лучшее, что я нашел, - это использовать, strace -p 18386
но я получаю орды текста, взлетающего по экрану, это слишком детально. Я могу остановиться, strace
а затем просеять вывод и найти текст, выводимый на стандартный вывод, но он очень длинный и запутанный, и, очевидно, пока он остановлен, я могу что-то пропустить. Я хотел бы найти способ увидеть вывод сценария вживую, как если бы я работал локально.
Кто-нибудь может улучшить это? Очевидный ответ - перезапустить скрипт с перенаправлением или в screen
сеансе и т. Д., Это не критически важный сценарий, поэтому я мог бы это сделать. Скорее, однако, я вижу это как забавное учебное упражнение.
источник
strace -p 4232 -e write
Ответы:
Если все, что вы хотите сделать, это шпионить за существующим процессом, вы можете использовать
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 hack, либо на ваш текущий терминал, либо на новый сеанс экрана. См. Как я могу отречься от запущенного процесса и связать его с новой экранной оболочкой? и другие связанные темы.
Обратите внимание, что в зависимости от того, как настроена ваша система, вам может потребоваться выполнить все эти
strace
команды от имени пользователя root, даже если процесс выполняется под вашим пользователем без каких-либо дополнительных привилегий. (Если процесс запущен от имени другого пользователя или установлен как setuid или setgid, вам потребуется запускатьstrace
с правами root.) Большинство дистрибутивов позволяют процессу отслеживать только его дочерние элементы (это обеспечивает умеренное преимущество в плане безопасности - предотвращает некоторые непосредственные внедрения вредоносного ПО, но не предотвращает косвенную инъекцию путем изменения файлов). Это контролируетсяkernel.yama.ptrace_scome
sysctl.источник
man strace
Вы можете получить доступ к выводу через
proc
файловую систему.1
= stdout,2
= stderrисточник
/dev/null
) - он будет работать, только если вывод перенаправлен в файл.ping google.es
а в другом - как root:tail -f /proc/`pgrep ping`/fd/2
и ничего не отображается.В BSD вы можете использовать,
watch
который отслеживает данный tty, напримерВ Linux это будет невозможно, если процесс не был запущен в мультиплексоре, например,
screen
илиtmux
. См. Также: Reptyr: присоединение запущенного процесса к новому терминалу.Это , кажется , единственный способ для отладки процесса (например
strace
,dtrace
/dtruss
,gdb
,lldb
и т.д.).Поскольку вы использовали
strace
для извлечения любого значимого вывода, вам нужно отфильтровать по уточняющему выражению (например,file
), а затем проанализировать вывод. Вот пример:Для этого он печатает операцию записи процесса (длина 1000), заданного параметром PID (используется
pgrep
для поиска по имени), перенаправляет стандартную ошибку в вывод (для фильтрации) и печатает строку в двойных кавычках.Если вы имеете дело с двоичным выводом, вы можете проанализировать символы escape-последовательностей, используя
read
(с-r
) иprintf
(с%b
), напримерПроверьте
help read
наличие дополнительных параметров (например,-n
для печати после определенного количества символов, а не перевода строки).Вот более полный пример:
Для примеров, использующих любой процесс, пожалуйста, проверьте: Как разобрать strace в оболочке в обычный текст? при переполнении стека
источник
Возможно, вы сможете посмотреть на удаленный экран, используя,
ssh localhost 'DISPLAY=:0.0 xwd -root' | xwud -scale
гдеlocalhost
следует заменить учетные данные для входа на удаленный сервер и:0.0
номер дисплея вашего графического интерфейса.Используйте
x11vnc
, который является VNC-сервером для вашего X-сеанса на экране.При запуске на одной из 6 виртуальных консолей попробуйте
sudo setterm -dump 2 -file /dev/stdout
, где вы замените2
соответствующий vc.источник
Я бы посоветовал сделать именованный канал (
mkfifo
), а затем записать в этот файл. Тогда читай из него. Вы всегда можете сделать это с помощью таких вещей, какtail
минимизация вывода и т. Д. Всякий раз, когда вы очищаете канал (считываете из него), он очищается, поэтому выход не сохраняется.Другой вариант - записать все в файл (очень похоже на файл журнала), а затем проанализировать его в любое время. Это было бы предпочтительным действием, если вы хотите сохранить весь вывод.
источник
Вы всегда можете запустить процесс с помощью nohup и &
Затем вы можете проверить прогресс любого tty с помощью:
Это прекрасно работает для меня.
источник
Очень просто получить вывод - захватить вывод в файл и настроить этот файл.
IF DO: ./ipcheck
INSTEAD DO: ./ipcheck> [replacewithyourfilename]
Это создаст выходной файл, в котором находится ваш скрипт. Затем из любой другой оболочки bash вы можете просто скопировать файл:
tail [replacewithyourfilename] -f
источник
setbuf(3)
), Что может создаватьtail
проблемы.Разбор вывода strace:
Я использовал верхний ответ (с моим идентификатором процесса 28223) ...
Чтобы определить, что меня волнует
write(9
. (9 используется ниже, это, вероятно, дескриптор файла и может отличаться для вашего процесса.) Затем я написал быстрый скрипт Ruby для анализа и отображения их.Вставьте следующее в
/usr/bin/parse_strace.rb
Не забывай
chmod a+x /usr/bin/parse_strace.rb
Я вызываю
strace -xx
(выводит hex, поэтому регулярное выражение соответствует), добавляя в скрипт (включая STDERR) мой9
первый аргумент.И, вуаля, он выводит исходное STDOUT процесса, новые строки, цвет и все!
источник
Вы не можете получить идентификатор процесса и связаться с ним по USR1,
который печатает PID вашего скрипта, а затем использовать его для
Я понимаю, что USR1 - это «определяемый пользователем» сигнал, означающий, что тот, кто создал программу, может использовать ее для обозначения «выключить», «сбросить ваши логи», «распечатать тысячу раз» или что-то еще.
источник