我正在服务器上的java程序中运行bash脚本。我刚刚上传了一个新版本的脚本,旨在下一次运行脚本以使用该版本。我并不意味着中断现有的,正在运行的脚本实例。但是,我刚从300台服务器收到了超过100次的崩溃通知。我猜想用新版本替换正在运行的bash脚本导致这一点。但是,这将要求运行的bash脚本从磁盘读取到每个新的步骤。这是怎么运作的?
bash脚本的运行版本运行一些光线跟踪软件。每次跑步需要2个小时。子步骤需要5分钟至1.5小时。脚本总是在脚本中完成一个步骤后报告崩溃。它从来没有报告崩溃已经运行的子步骤。一些崩溃报告没有找到我在脚本中找不到的命令。不同的崩溃报告不同的地方。
帮帮我!
SiegeX是一半,bash会将整个脚本加载到内存中,因此脚本可以继续运行,即使在进程运行时它的源文件被删除。但是,bash还会检查在脚本运行时源文件是否更新。如果是这样,bash将重新加载它,并从当前位置继续运行,重新打开该文件,寻求脚本的当前位置,并从该点继续运行脚本。
原文链接:https://www.f2er.com/bash/387593.html这是一个概念验证脚本:
# 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
因此,如果您关心当前正在运行该脚本的进程,那么结果是不要修改bash脚本的源文件。
(此脚本显示“Foo”,bash脚本的“当前位置”始终位于行的开头或结尾。)
echo "sleep 5 ; echo Foo" > foo.sh bash foo.sh & sleep 2 echo "sleep 5 ; echo Bar" > foo.sh wait