我经常让任务在屏幕内运行,以便稍后检查它们,但有时我需要检查屏幕内正在运行哪个命令。它通常是某种 php 脚本,例如
screen -d -m nice -n -10 php -f convertThread.php start=10000
我不记录哪些屏幕正在运行哪个命令,但我希望能够通过检查其中运行的命令来了解所取得的进度,而无需终止进程。
我在屏幕帮助页面中没有看到任何选项。
答案1
我最近不得不这样做。在 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。使用屏幕会话的 PID ,通过搜索已知 PID 的 PPID(父 PID)foo_Monitor
来获取在其中运行的会话的 PID :bash
$ 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
ongrep 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}')
答案2
如何screen -S <your-fancy-name>
根据屏幕会话运行的命令为屏幕会话提供有意义的名称?名称将通过 列出screen -ls
并用于恢复会话screen -r <your-fancy-name>
。
编辑添加:
因为就在前几天它才引起我的注意。tmux
提供与(如果不是更多)完全相同的功能集,screen
并附带适合您需求的功能。来自常见问题解答:“tmux 支持自动将窗口重命名为正在运行的应用程序,而无需使用转义序列进行严重黑客攻击。默认情况下甚至是打开的。”