Узнайте, какая команда выполняется в сеансе экрана


10

Я часто оставляю задачи, выполняющиеся на экране, чтобы позже их можно было проверить, но иногда мне нужно проверить, какая команда выполняется на экране. Обычно это php-скрипт, такой как

screen -d -m nice -n -10 php -f convertThread.php start=10000

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

Я не вижу никакой возможности для этого на страницах справки экрана.

Ответы:


18

Я недавно должен был сделать это. На переполнение стека я ответил, как найти PID процесса, запущенного на экране . Когда у вас есть PID, вы можете использовать его psдля получения команды. Вот содержание этого ответа с дополнительным содержанием для решения вашей ситуации:

Вы можете получить PID экранных сессий вот так:

$ screen -ls
There are screens on:
        1934.foo_Server         (01/25/15 15:26:01)     (Detached)
        1876.foo_Webserver      (01/25/15 15:25:37)     (Detached)
        1814.foo_Monitor        (01/25/15 15:25:13)     (Detached)
3 Sockets in /var/run/screen/S-ubuntu.

Допустим, вы хотите, чтобы PID программы, запущенной в Bash, во время foo_Monitorсеанса экрана. Используйте PID foo_Monitorсеанса экрана, чтобы получить PID bashсеанса, запущенного в нем, путем поиска PPID (PID PID) для известного PID:

$ ps -el | grep 1814 | grep bash
F S   UID   PID  PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
0 S  1000  1815  1814  0  80   0 -  5520 wait   pts/1    00:00:00 bash

Теперь получите только PID bashсессии:

$ ps -el | grep 1814 | grep bash | awk '{print $4}'
1815

Теперь мы хотим, чтобы процесс с этим PID. Просто вложите команды, и на этот раз используйте -vфлаг on, grep bashчтобы получить процесс, который не является bash:

$ echo $(ps -el | grep $(ps -el | grep 1814 | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')
23869

Мы можем использовать этот PID, чтобы найти команду (смотрите в конце второй строки):

$ ps u -p 23869
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
dotanco+ 18345 12.1 20.1 5258484 3307860 ?     Sl   Feb02 1147:09 /usr/lib/foo

Положил все это вместе:

$ ps u -p $(ps -el | grep $(ps -el | grep SCREEN_SESSION_PID | grep bash | awk '{print $4}') | grep -v bash | awk '{print $4}')

О, умный! Мне это нравится! Поскольку это отвечает на вопрос напрямую, я собираюсь принять этот ответ. Я ценю это! Извините @Ghanima (: '
Остин Берк

7

Как насчет использования, screen -S <your-fancy-name>чтобы дать сеансам экрана значимые имена в соответствии с командами, которые они запускают? Имена будут перечислены с screen -lsи будут использоваться для возобновления сеанса screen -r <your-fancy-name>.

Изменить, чтобы добавить:

Так как это было доведено до моего внимания только на днях. tmuxпредлагает тот же набор функций, что и screen(если не больше), и поставляется с функцией, соответствующей вашим потребностям. Из FAQ: «tmux поддерживает автоматическое переименование окон в работающее приложение без грубых взломов с использованием escape-последовательностей. Даже по умолчанию включено».

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.