我正在从服务器上的java程序运行bash脚本.我刚上传了一个新版本的脚本,打算在下一次运行脚本时使用该版本.我并不打算中断现有的,运行的脚本实例.但是,我刚从300台服务器收到100多个崩溃通知.我猜测用新版本替换正在运行的bash脚本导致了这个问题.但是,这将要求运行的bash脚本在进入每个新步骤时从磁盘读取.这是怎么回事?
bash脚本的运行版本运行一些光线跟踪软件.每次运行需要2个小时.子步骤需要5分钟到1.5小时.在脚本中完成一个步骤后,脚本始终报告崩溃.它永远不会报告已经运行的子步骤崩溃.一些崩溃报告没有找到我在脚本中找不到的命令.不同的崩溃报告不同的地方.
救命!
编辑:我使用scp将脚本复制到所有300台服务器.该文件已在文件系统上替换.这不是共享文件.
mob*_*mob 17
SiegeX是一半 - bash会将整个脚本加载到内存中,因此即使在进程运行时删除了源文件,脚本也可以继续运行.但是bash还会在脚本运行时检查源文件是否更新.如果已经存在,bash将重新加载它并继续从当前位置运行它重新打开文件,寻找脚本的当前位置,并从该点继续运行脚本.
这是一个概念验证脚本:
# If you modify a script, will it change the behavior of
# processes that are currently running that script?
# Does this script print "Foo" or "Bar"?
cat >foo.sh <<EOF
sleep 5
echo Foo
EOF
bash foo.sh &
sleep 2
cat >foo.sh <<EOF
sleep 5
echo Bar
EOF
wait
Run Code Online (Sandbox Code Playgroud)
因此,如果您关心当前运行该脚本的进程,那么结果就是不要修改bash脚本的源文件.
(但是,此脚本显示"Foo".bash脚本的"当前位置"始终位于行的开头或结尾.)
echo "sleep 5 ; echo Foo" > foo.sh
bash foo.sh &
sleep 2
echo "sleep 5 ; echo Bar" > foo.sh
wait
Run Code Online (Sandbox Code Playgroud)