linux - 递归调用sh脚本的安全方法

标签 linux bash

所以我发现在 Linux 中这样做的困难方法真的很糟糕:

# a.sh
while true
do
  some stuff
  sh a.sh
done

我希望能够更新脚本并让它自行修复。这样的东西被认为是安全的吗/

# a.sh
while true
do
  wget http://127.0.0.1/b.sh
  sh b.sh
done

# b.sh
some stuff

这样我就可以更新脚本b.sh并且它的下一次执行将被强制更新自 a.sh称之为?

最佳答案

如果您希望一个进程更改其源代码并重新启动自身,并且您不希望该进程的多个(略有不同)副本同时运行,那么您需要以某种方式终止父进程。你如何做到这一点并不重要;重要的是。例如,如果代码的“重写自身”部分仅在实际需要重写时触发,那么您可以将“exit”放在调用重写脚本的行后面。 (我怀疑像 mv -f b.sh a.sh && sh a.sh && exit 这样的东西也可能起作用,因为我认为在脚本被销毁之前整行都会被发送到 Bash 解释器。)

如果您确实希望运行进程的多个副本,那么您需要找到某种方法来限制此数量。例如,您可以让脚本在 fork 之前检查其自身已经运行了多少次迭代。

请注意,在这两种情况下,这都假设您的脚本已准确地修改了自身,这......至少可以说是一个棘手的问题。你正踏上危险的土地。

最后,如果您真正想要的是一个在死亡时自动重新启动的守护进程(这听起来就像您在评论中所描述的那样),那么还有其他方法可以实现此目的。我不太熟悉这类事情通常是如何完成的,但我想在 shell 脚本中您可以简单地使用 trap。 (trap a.sh EXIT 可能就足够了,尽管如果您后来发现自己犯了一个错误,这将使您的脚本相当难以永久终止。)

关于linux - 递归调用sh脚本的安全方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28164961/

相关文章:

java - 在java程序中执行bash命令

python - 从 subprocess.Popen 启动时 Drush 挂起

windows - 在 Windows 上使用 Pandoc 连接多个 Markdown 文件

linux - 使用 sed 根据正则表达式结果替换部分文本

bash - 如何比较两个巨大的文本文件(每个超过 50GB)?

bash - 进程退出时未传递 SIGCHLD

arrays - bash 将 XML 解析为多维数组

linux - 如何查找进程打不开的文件夹

linux - 无法处理虚拟地址处的内核分页请求 - 内核 OOPS

linux gst_element_factory_make ("rtspsrc",NULL)在 qt5 上失败