我如何确定进程正在执行哪个脚本?当我使用时:
ps -u user
我得到以下输出:
10005194 26932 0.0 0.0 112700 1544 ? Ss Jun03 0:00 -bash
10005194 27117 0.0 0.0 112700 1528 ? Ss Apr24 0:00 -bash
10005194 27164 0.0 0.0 112700 2040 ? Ss Jun06 0:00 -bash
10005194 27404 0.0 0.0 112700 1544 ? Ss May27 0:00 -bash
10005194 27484 0.0 0.0 112700 1528 ? Ss Apr23 0:00 -bash
10005194 27531 0.0 0.0 112700 1528 ? Ss May22 0:00 -bash
...
有数百行。我知道该用户正在执行许多脚本,但我想缩小哪些脚本占用线程的范围。有没有办法做到这一点?
答案1
使用w
(表示“宽”)选项。
来自man ps
(搜索wide
):
w
宽输出。使用此选项两次可获得无限宽度。
例如ps ww -u cas
:
$ ps ww -U cas | grep bash
1350 pts/0 Ss 0:00 -bash
18345 pts/34 S 0:00 /bin/bash /home/cas/bin/myscript.sh
21293 pts/34 Ss+ 0:00 bash
这-bash
是一个登录 shell。
plainbash
是一个非登录交互式 shell - ttypts/34
是相同的,因此您可以看出它是 bash shell 的父 shell(或远祖父母)myscript.sh
。
使用 /usr/env/bin bash 会阻止您确定正在运行的脚本。相反,您应该准确指定 bash 可执行文件是否适用于您正在运行的计算机。
答案2
正如@cas 所建议的,ps
可以向您展示一些信息。添加选项可以显示命令行,这是朝着正确方向迈出的一步。鉴于这个脚本:
#!/usr/bin/env bash
while true
do
date
sleep 10
done
建议ps -ww
显示该过程的这些行:
9417 pts/5 00:00:00 bash
9496 pts/5 00:00:00 sleep
然而,ps -fwwl -u $USER
显示了这一点:
0 S tom 9417 9416 0 80 0 - 29405 - 18:08 pts/5 00:00:00 bash ./foo
0 S tom 9419 9417 0 80 0 - 28111 - 18:08 pts/5 00:00:00 sleep 10
因为我执行了./foo
。如果我从我的路径中执行“foo”,当然,就不会有“./”。在任何一种情况下,执行的实际脚本取决于 的值$PATH
以及当前工作目录(启动脚本时)。对于某些带有 procfs 的系统(例如 Linux),可以获得该信息:
考虑到所有这些,人们有足够的信息(至少对于 Linux 而言)来构建一个脚本,该脚本将分析 的输出以ps
查找带有(或不带有)完整路径名的脚本。
奇怪的是,我本来希望lsof
提供这些信息,因为大多数 shell 的行为就好像它们有一个打开的脚本文件描述符(但我在快速检查中没有看到它)。因此,分析ps
shell 的环境似乎是获得完整解决方案的方法。
进一步阅读: