3

假设我run.sh在后台运行 bash 脚本,然后修改run.sh. 无论如何要查看run.sh脚本的原始内容吗?

例如:

echo "echo a1; sleep 120; echo a2" > run.sh; bash run.sh& 
aPid=$!
echo "echo bbbbbb" > run.sh

我期待类似的东西cat {magic file/path},它会打印出来

echo a1; sleep 120; echo a2

我正在四处寻找 /proc/$aPid ,但找不到任何东西。

4

2 回答 2

2

bash似乎试图将它当前正在解释的脚本放在文件描述符 255 上,至少在我的系统上,对文件描述符最大值没有任何活动的非默认约束等......这可能不能保证,所以你可能不得不玩有点,但考虑到正在运行的bash /some/script/sh进程的 PID,您可以查看/proc/<PID>/fd/文件描述符链接 - 0、1 和 2 当然是预定义的 stdin/stdout/stderr 链接,根据您的脚本可能还有其他链接确实如此,但是筛选该目录的内容以找出哪个文件描述符对应于您的脚本文件应该不难,您可以通过它cat或其他任何方式(例如cat /proc/12345/fd/255)查看原始脚本。

于 2013-04-10T19:57:59.380 回答
2

首先确保您的 ulimit 设置为允许核心文件。尝试

ulimit -c unlimited

接下来,运行您的脚本

./run.sh

在您的脚本运行时,修改或删除run.sh脚本文件。

ps ax查找第一个run.sh脚本的进程 ID (PID) 。你应该看到类似的东西

19365 pts/5    S+     0:00 /bin/bash ./run.sh

然后做

kill -SIGSEGV 19365

你应该看到类似的东西

Segmentation fault (core dumped)

在您第一次运行的终端窗口中run.sh

最后,做

strings core

core文件上。在字符串的某处,您应该会看到原始run.sh文件的文本。

学分:这个答案改编自Retrieve plain text script from compiled bash script

于 2013-04-10T19:34:23.353 回答