我经常让任务在屏幕上运行,以便以后可以检查它们,但有时我需要检查屏幕上正在运行的命令。通常是各种php脚本,例如
screen -d -m nice -n -10 php -f convertThread.php start=10000
我没有记录哪个屏幕正在运行哪个命令,但是我希望能够通过检查其中运行的命令来了解进度,而不会终止该过程。
我在屏幕帮助页面中看不到任何选项。
我经常让任务在屏幕上运行,以便以后可以检查它们,但有时我需要检查屏幕上正在运行的命令。通常是各种php脚本,例如
screen -d -m nice -n -10 php -f convertThread.php start=10000
我没有记录哪个屏幕正在运行哪个命令,但是我希望能够通过检查其中运行的命令来了解进度,而不会终止该过程。
我在屏幕帮助页面中看不到任何选项。
Answers:
我最近不得不这样做。在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}')