如何判断bash正在执行哪个脚本?

如何判断bash正在执行哪个脚本?

我如何确定进程正在执行哪个脚本?当我使用时:

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 的行为就好像它们有一个打开的脚本文件描述符(但我在快速检查中没有看到它)。因此,分析psshell 的环境似乎是获得完整解决方案的方法。

进一步阅读:

相关内容