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

nea*_*mcb 13 linux debugging bash

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

或者我可以通过查看/ proc中的bash进程条目轻松找到答案吗?是否有方便的工具在活动文件中提供行号?

我不想杀死并重启该过程.

这是在Linux上 - Ubuntu 10.04.

Mei*_*Mei 14

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

有很多方法可以找到比预期更多的关于运行过程的信息.

使用lsof -p $pid以查看哪些文件是开放的,这可能会给你一些线索.请注意,某些文件虽然"已删除",但仍可由脚本保持打开状态.只要脚本没有关闭文件,它仍然可以从中读取和写入 - 文件仍占用文件系统的空间.

使用strace积极跟踪脚本使用的系统调用.该脚本将读取脚本文件,因此您可以在执行前查看一些命令.read使用此命令查找命令:

strace -p $pid -s 1024
Run Code Online (Sandbox Code Playgroud)

这使得命令打印字符串的长度最多为1024个字符(通常,strace命令会截断比这短得多的字符串).

检查目录/proc/$pid以查看有关脚本的详细信息; 特别注意,看看/proc/$pid/environ哪个将为您提供由空值分隔的进程环境.要正确读取此"文件",请使用以下命令:

xargs -0 -i{} < /proc/$pid/environ
Run Code Online (Sandbox Code Playgroud)

您可以less将其传输到文件中或将其保存在文件中.还有,/proc/$pid/cmdline但有可能只会给你shell名称(-bash例如).


Jür*_*zel 10

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

ps --ppid  $(pidof yourscript)
Run Code Online (Sandbox Code Playgroud)

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

#!/bin/bash

trap "set -x" SIGUSR1
trap "set +x" SIGUSR2

while true; do
    sleep 1
done
Run Code Online (Sandbox Code Playgroud)

然后用

kill -USR1 $(pidof yourscript)
kill -USR2 $(pidof yourscript)
Run Code Online (Sandbox Code Playgroud)


小智 6

用于pstree显示您的脚本正在调用什么 Linux 命令/可执行文件。例如,21156是我挂脚本的pid:

\n\n\n\n
ocfs2cts1:~ # pstree -pl 21156\nactivate_discon(21156)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80mpirun(15146)\xe2\x94\x80\xe2\x94\xac\xe2\x94\x80fillup_contig_b(15149)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80sudo(15231)\xe2\x94\x80\xe2\x94\x80\xe2\x94\x80chmod(15232)\n                                       \xe2\x94\x9c\xe2\x94\x80ssh(15148)\n                                       \xe2\x94\x94\xe2\x94\x80{mpirun}(15147)\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以,我知道它正在听chmod指挥。然后,通过以下方式显示堆栈跟踪:

\n\n
ocfs2cts1:~ # cat /proc/15232/stack \n[<ffffffffa05377ef>] __ocfs2_cluster_lock.isra.39+0x1bf/0x620 [ocfs2]\n[<ffffffffa053856d>] ocfs2_inode_lock_full_nested+0x12d/0x840 [ocfs2]\n[<ffffffffa0538dbb>] ocfs2_inode_lock_atime+0xcb/0x170 [ocfs2]\n[<ffffffffa0531e61>] ocfs2_readdir+0x41/0x1b0 [ocfs2]\n[<ffffffff8120d03c>] iterate_dir+0x9c/0x110\n[<ffffffff8120d453>] SyS_getdents+0x83/0xf0\n[<ffffffff815e126e>] entry_SYSCALL_64_fastpath+0x12/0x6d\n[<ffffffffffffffff>] 0xffffffffffffffff\n
Run Code Online (Sandbox Code Playgroud)\n\n

哦,天哪,这可能是一个死锁错误......

\n