找出屏幕会话中正在运行的命令


10

我经常让任务在屏幕上运行,以便以后可以检查它们,但有时我需要检查屏幕上正在运行的命令。通常是各种php脚本,例如

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

我没有记录哪个屏幕正在运行哪个命令,但是我希望能够通过检查其中运行的命令来了解进度,而不会终止该过程。

我在屏幕帮助页面中看不到任何选项。

Answers:


18

我最近不得不这样做。在Stack Overflow上,我回答了如何查找屏幕中运行的进程的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.

让我们假设您希望在foo_Monitor屏幕会话中以Bash运行程序的PID 。通过在PPID(父PID)中搜索已知PID ,使用foo_Monitor屏幕会话的PID来获取bash正在运行的会话的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

现在只获取bash会话的PID :

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

现在,我们需要具有 PID 的过程。只需嵌套命令,这一次使用-v标记打开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(:'
Austin Burk,

7

怎样screen -S <your-fancy-name>根据它们运行的​​命令为屏幕会话赋予有意义的名称呢?名称将以列出,screen -ls并用于通过来恢复会话screen -r <your-fancy-name>

编辑添加:

由于前几天已引起我注意。tmux提供的功能与screen(甚至更多)功能相同,并具有满足您需求的功能。在FAQ中:“ tmux支持自动将窗口重命名为正在运行的应用程序,而无需使用转义序列进行大量修改。默认情况下,tmux甚至是启用的。”

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.