我在服务器上运行来自java程序的bash脚本。我刚刚上传了一个新版本的脚本,打算下一次运行该脚本以使用该版本。我并不是有意中断脚本的现有运行实例。然而,我刚刚从我的300台服务器上收到了100多个崩溃通知。我猜是用新版本替换正在运行的bash脚本导致的。但是,这需要运行的bash脚本在进入每个新步骤时从磁盘读取数据。它是这样工作的吗?
运行版本的bash脚本运行一些光线跟踪软件。每次运行需要2个小时。子步骤需要5分钟到1.5小时。脚本在完成脚本中的一个步骤后总是报告崩溃。它从不报告已经在运行的子步骤崩溃。一些崩溃报告找不到我在脚本中找不到的命令。不同的崩溃报告不同的位置。
帮助!
编辑:我使用scp将脚本复制到所有300台服务器上。文件系统上的文件已被替换。这不是共享文件。
发布于 2016-09-06 23:03:56
我不确定自从mob的回答被接受后,情况是否发生了变化,但在bash 4.3.46 (例如ubuntu 16.04附带的)中,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
rm foo.sh
cat >foo.sh <<EOF
sleep 5
echo Bar
EOF
wait
现在可以打印Foo
。
发布于 2011-01-21 09:43:05
在调用时,bash将派生一个新进程并将脚本加载到内存中。除非脚本引用它自己,否则它应该仍然可以工作。下面是一个脚本示例,该脚本在尝试通过$0
访问自身之前,既从磁盘中删除自身,又保持工作状态
输入
#!/bin/bash
echo "I can't take it anymore"
echo "Goodbye World!"
rm -f "$0"
echo "Wait, I change my mind!"
sed 's/Goodbye/Hello/' "$0"
输出
$ ./suicide.sh
I can't take it anymore
Goodbye World!
Wait, I change my mind!
sed: can't read ./suicide.sh: No such file or directory
https://stackoverflow.com/questions/4754592
复制相似问题