我可以使用ps看到后台进程。但是有没有办法查看前台进程呢?例如,
$nohup process1 &
然后
ps -ef | grep“进程1”
将显示正在执行的进程“process1”。但上面的命令不会显示执行的前台进程,例如,
$进程2
答案1
您可能会感到困惑,因为ps
默认情况下会显示调用所在终端上的进程ps
,例如从同一终端窗口启动的进程。
ps -u $LOGNAME
如果您知道终端名称,请尝试或ps -t $THETTYNAME1,$THETTYNAME2
。 (终端名称通常看起来像“ttyN”或“pts/N”)。
答案2
奇怪的是,ps 命令允许您监视所有活动进程的状态,包括前台和后台。
例如,我在第一个 shell 中启动以下进程:
$ startNetworkServer
Security manager installed using the Basic server security policy.
Apache Derby Network Server - 10.3.2.1 - (599110) started and ready to accept connections on port 1527 at 2010-06-18 14:14:33.277 GMT
在另一个外壳中:
$ ps aux | grep NetworkServer | grep -v grep
pascal 5928 0.3 1.4 661492 29216 pts/0 Sl+ 16:14 0:03 /usr/lib/jvm/java-6-sun/bin/java -classpath /usr/share/javadb/lib/derby.jar:/usr/share/javadb/lib/derbynet.jar:/usr/share/javadb/lib/derbytools.jar:/usr/share/javadb/lib/derbyclient.jar org.apache.derby.drda.NetworkServerControl start
该进程按预期列出(并且+
显示它位于前台进程组中)。
答案3
问题:
“有办法查看前台进程吗?”然后问题继续声称ps -ef
不显示在前台运行的进程。
回答:
是的, 有一种方法。还:ps -ef
做显示在前台运行的进程 -但它没有显示状态过程的。这在文档 ( man ps
) 中进行了解释,并且可以通过简单的实验进行验证。考虑这个例子:
在一个终端中,运行:
ping 8.8.8.8 > /dev/null
在另一个终端中:
ps -ef | grep ping | grep -v grep
seamus 1161 974 0 23:20 pts/1 00:00:00 ping 8.8.8.8
注意ps -ef
不提供状态其输出中的信息。然而,man ps
解释说状态信息可用-o
与关键字一起使用时的参数stat
:
ps -eo pid,stat,command | grep ping | grep -v grep
1161 S+ ping 8.8.8.8
这告诉我们:
- 进程PID是
1161
通过关键字pid
- 过程状态是
S+
通过关键字stat
- 关键字
command
显示ping 8.8.8.8
产生了该过程
这状态的值S+
是解码的在man ps
的标题下PROCESS STATE CODE
。这告诉我们:
S 可中断睡眠(等待事件完成)
+ 处于前台进程组
量子电动力学
我们已经看到ps -ef
列出了 PID 为 的进程1161
,并且ps -eo pid,stat,command
揭示了状态PID1161
为前景过程。
注 1: 关键词标题下-o
描述了该论点。这里解释了关键字产生两个字符的过程man ps
STANDARD FORMAT SPECIFIERS
stat
状态,而关键字state
仅产生一个字符状态。
笔记2:这适用于我的基于 Debian 的系统(报告为版本ps from procps-ng 3.3.15
)和 macOS 10.15(源自 BSD 版本ps
)。