Дізнайтеся, яка команда виконується в межах екранного сеансу


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:

$ 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прапор, grep 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 підтримує автоматичне перейменування Windows на працюючу програму без грубих хак, використовуючи евакуаційні послідовності. Її навіть увімкнено за замовчуванням."

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.