gpt4 book ai didi

bash - 用新版本替换 bash 脚本会导致脚本的运行实例失败

转载 作者:行者123 更新时间:2023-11-29 08:45:52 26 4
gpt4 key购买 nike

我正在从服务器上的 java 程序运行 bash 脚本。我刚刚上传了一个新版本的脚本,打算在下一次运行脚本时使用该版本。我并不是要中断现有的、正在运行的脚本实例。但是,我刚刚从我的 300 台服务器收到了 100 多条崩溃通知。我猜想用新版本替换正在运行的 bash 脚本会导致此问题。但是,这需要运行的 bash 脚本在到达每个新步骤时从磁盘读取。这是它的工作原理吗?

bash 脚本的运行版本运行一些光线追踪软件。每次运行需要 2 小时。子步骤需要 5 分钟到 1.5 小时。完成脚本中的一个步骤后,脚本总是报告崩溃。它从不报告崩溃已经运行的子步骤。一些崩溃报告没有找到我在脚本中找不到的命令。不同的崩溃报告不同的地方。

帮助!

编辑:我使用 scp 将脚本复制到所有 300 台服务器。该文件已在文件系统上被替换。这不是共享文件。

最佳答案

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

因此,如果您关心当前正在运行该脚本的进程,则不要修改 bash 脚本的源文件。


(然而,这个脚本显示“Foo”。bash 脚本的“当前位置”总是在一行的开头或结尾。)

echo "sleep 5 ; echo Foo" > foo.sh
bash foo.sh &
sleep 2
echo "sleep 5 ; echo Bar" > foo.sh
wait

关于bash - 用新版本替换 bash 脚本会导致脚本的运行实例失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4754592/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com