如何在启动进程后执行 Linux 启动脚本中的进一步命令

如何在启动进程后执行 Linux 启动脚本中的进一步命令

我正在尝试编写一个启动脚本,在服务器重启后执行一个应用程序 (MapProxy)。我的服务器运行的是 Ubuntu 11.04 Natty 64 位。

在脚本中,我执行了一个 Python 脚本exec python /$path/"config.py" &,成功创建了 Web 服务器可以与之通信的 fcgi.socket。但是,我需要使 fcgi.socket 可写,否则 MapProxy 将无法工作,即我需要对其执行 chmod。

似乎在我执行 config.py 后,我失去了对启动脚本的控制 - 它不会继续使 fcgi.socket 可写。有什么想法吗?

#! /bin/bash
:
exec python /$path/"config.py" &
exec chmod o+w /$path/"fcgi.socket" &
exit 0

答案1

新脚本:

#! /bin/bash
python /$path/"config.py" &&
chmod o+w /$path/"fcgi.socket"

&将一个进程发送到后台并立即执行下一个进程。&&等待最后一个进程的返回值,如果为零,则启动下一个进程。

删除exit 0is 以便获取脚本中最后执行的任何进程的错误代码。它应该为零,但这样如果出现错误,它将传播。

答案2

删除execs 和&符号。这会将处理推迟到后台,以便下一个命令可以立即运行。实际上,您正在更改尚不存在的文件的权限,因为第一个命令需要一些时间来运行和创建套接字。

答案3

您似乎忽略了重要的一点,即该exec部分正在做什么。来自 bash 的help exec:“用给定的命令替换 shell。”。当您说exec python /$path/"config.py"您的脚本时,本质上是在说“我在这里完成了,让我们让 python 从这里开始,执行这个 python 脚本,它返回的就是我返回的”。因此脚本中后面的任何内容都不会执行。除非这是您的脚本执行的最后一件事,否则使用 exit 是没有意义的。

此脚本末尾有“exit 0”,表示“我的脚本应该终止,就像一切都成功一样,无论其他操作是否失败”。如果这确实是您想要的,那么您就不想使用 exec,因为脚本的退出代码将是您执行的任何进程的退出代码。相反,您可能希望从 python 或 chmod 返回实际的失败结果(如果得到)。

相关内容