假设我在后台运行bash脚本run.sh
,然后修改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,但找不到任何东西。
答案 0 :(得分: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
<{1>}文件上的。在字符串中的某处,您应该看到原始core
文件的文本。
致谢:这个答案改编自Retrieve plain text script from compiled bash script。
答案 1 :(得分:2)
bash
似乎试图将目前正在解释的脚本放在文件描述符255上,至少在我的系统上,没有对文件描述符最大值有任何有效的非默认约束等等......这可能无法保证,所以你可能需要稍微玩一下,但考虑到正在运行的bash /some/script/sh
进程的PID,你可以在/proc/<PID>/fd/
查看文件描述符链接 - 0,1和2当然是预定义的stdin / stdout / stderr,并且可能还有其他的,具体取决于你的脚本的作用,但是筛选该目录的内容以确定哪个文件描述符对应于你的脚本文件应该不会太难可以比cat
或其他任何内容(例如cat /proc/12345/fd/255
)查看原始脚本。