Linux 是否可以查看正在运行但经过修改的bash脚本的原始内容?

Linux 是否可以查看正在运行但经过修改的bash脚本的原始内容?,linux,bash,Linux,Bash,假设我在后台运行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,但找不

假设我在后台运行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,但找不到任何内容。

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

ulimit -c unlimited
接下来,运行脚本

./run.sh
脚本运行时,修改或删除
run.sh
脚本文件

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

19365 pts/5    S+     0:00 /bin/bash ./run.sh
Segmentation fault (core dumped)
那就做吧

kill -SIGSEGV 19365
你应该看到类似的东西

19365 pts/5    S+     0:00 /bin/bash ./run.sh
Segmentation fault (core dumped)
在第一次运行的终端窗口中
run.sh

最后,做

strings core
核心
文件上。在字符串的某个地方,您应该可以看到原始
run.sh
文件的文本


学分:此答案改编自。

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

Bash(有点奇怪)在执行过程中重新读取脚本,因此,如果您在脚本文件运行时删除它,它可能会终止或死亡。@tripleee:您有具体的例子吗?在bash解释器中运行了几个脚本文件之后,我删除了它们,但没有看到您提到的内容。@tripleee:您说的有些道理。我想说的是,有证据表明Bash在执行下一个块之前可能只读取下一个块,因此,除了非常琐碎的脚本之外,您在任何时候都找不到加载到core中的整个脚本。@tripleee:在我看来,Bash首先解析整个脚本文件,打印任何错误,然后执行。执行编辑,
mv
rm
对您在核心转储中看到的脚本没有影响。你能提供一个反例吗?哇,我不知道。另见和。谷歌透露ksh使用fd 10的目的是相同的(因此它们似乎事实上是固定的,但是是的,不要依赖它。+1!谢谢@twalberg,这正是我想要的。但是,如果有一个后台子shell
echo'(echo a;sleep 120;echo a)和run.sh,它将不起作用