首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >用新版本替换bash脚本是否会导致正在运行的脚本实例失败

用新版本替换bash脚本是否会导致正在运行的脚本实例失败
EN

Stack Overflow用户
提问于 2011-01-21 09:35:43
回答 2查看 4K关注 0票数 18

我在服务器上运行来自java程序的bash脚本。我刚刚上传了一个新版本的脚本,打算下一次运行该脚本以使用该版本。我并不是有意中断脚本的现有运行实例。然而,我刚刚从我的300台服务器上收到了100多个崩溃通知。我猜是用新版本替换正在运行的bash脚本导致的。但是,这需要运行的bash脚本在进入每个新步骤时从磁盘读取数据。它是这样工作的吗?

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

帮助!

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

EN

回答 2

Stack Overflow用户

发布于 2016-09-06 23:03:56

我不确定自从mob的回答被接受后,情况是否发生了变化,但在bash 4.3.46 (例如ubuntu 16.04附带的)中,bash确实会监控脚本文件的变化,但如果文件被删除,这一点就会被破坏。

因此,对他的脚本稍作修改就可以做“正确”的事情:

代码语言:javascript
复制
# 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

票数 1
EN

Stack Overflow用户

发布于 2011-01-21 09:43:05

在调用时,bash将派生一个新进程并将脚本加载到内存中。除非脚本引用它自己,否则它应该仍然可以工作。下面是一个脚本示例,该脚本在尝试通过$0访问自身之前,既从磁盘中删除自身,又保持工作状态

输入

代码语言:javascript
复制
#!/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"

输出

代码语言:javascript
复制
$ ./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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4754592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档