正在运行的bash脚本挂在某处。 我能找出它在哪条线上吗?

例如,bashdebugging器是否支持附加到现有进程并检查当前状态?

或者我可以通过查看/ proc中的bash进程条目轻松find它们吗? 有没有一个方便的工具来给活动文件的行号?

我不想杀死并重新启动这个过程。

这是在Linux – Ubuntu 10.04。

我最近发现自己处于类似的位置。 我有一个shell脚本不能通过其他方式识别(如参数等)

有很多方法可以找到更多关于正在运行的进程的信息。

使用lsof -p $pid来查看打开的文件,这可能会给你一些线索。 请注意,某些文件在“已删除”时,仍然可以通过脚本保持打开状态。 只要脚本没有关闭文件,它仍然可以读写,文件仍然占用文件系统的空间。

使用strace主动跟踪脚本使用的系统调用。 该脚本将读取脚本文件,以便在执行之前可以看到一些命令。 使用此命令查找read命令:

 strace -p $pid -s 1024 

这使命令打印长达1024个字符的字符串(通常, strace命令会截断比这更短的字符串)。

检查目录/proc/$pid以查看有关脚本的详细信息; 特别要注意的是,请参阅/proc/$pid/environ这会给你由null分隔的进程环境。 要正确读取这个“文件”,使用这个命令:

 xargs -0 -i{} < /proc/$pid/environ 

您可以将其转换为less的文件或将其保存在文件中。 还有/proc/$pid/cmdline但可能只会给你shell的名字(例如-bash )。

没有真正的解决 但在大多数情况下,脚本正在等待子进程终止:

 ps --ppid $(pidof yourscript) 

你也可以在shell中设置信号处理程序:skript切换打印命令:

 #!/bin/bash trap "set -x" SIGUSR1 trap "set +x" SIGUSR2 while true; do sleep 1 done 

然后使用

 kill -USR1 $(pidof yourscript) kill -USR2 $(pidof yourscript) 

使用pstree来显示脚本正在调用的是哪个linux命令/可执行文件,例如, 21156是我的挂起脚本的pid:

 ocfs2cts1:~ # pstree -pl 21156 activate_discon(21156)───mpirun(15146)─┬─fillup_contig_b(15149)───sudo(15231)───chmod(15232) ├─ssh(15148) └─{mpirun}(15147)