bash - Shell脚本运行命令创建多个进程

标签 bash shell unix

我有以下 bash 脚本:

COMMAND="python myservice.py start"
su root -c "$COMMAND" &
exit 0

当我运行脚本并执行时

ps ax | grep myservice

我正在运行三个进程:

4311 su root -c python myservice.py start
4421 /bin/bash -c python myservice.py start
4456 python myservice.py start

我想知道为什么会创建三个进程?

当我按如下方式更改脚本时:

COMMAND="python myservice.py start"
su root -c "/bin/bash -c \"$COMMAND"\" & " &

我有两个进程正在运行:

5121 /bin/bash -c python myservice.py start
4793 python myservice.py start

我的印象是,在第一个 su 命令中附加 & 将在命令运行后终止进程。我不确定/bin/bash -c python myservice.py start 进程是在哪里创建的。

我是否可以将正在运行的进程合并为一个?另外,如何更改进程名称,使其看起来如下所示:

 4793 myservice

相反
 4793 python myservice.py start

就像现在一样。

提前致谢。

最佳答案

在你的第一个场景中,我认为很清楚为什么 supython进程存在,并且您不清楚为什么 bash进程存在。来自su联机帮助页:

   -c, --command COMMAND
       Specify a command that will be invoked by the shell using its -c.

简单的答案是,这个 bash shell 进程的启动只是因为文档说明它会启动。但是,我怀疑这样做的原因是为了允许您将复杂的命令传递给 su (例如,包括管道、重定向、shell 内置函数等)。

su 是可能的 fork 并简单地调用 execve()系统调用给定的程序路径和参数,但如果是这种情况,许多 shell 功能将会丢失 - 或者您必须显式调用 su root -c "/bin/bash -c <non-trivial command>"


在第二种情况下,会发生以下情况:

  • su启动并置于后台
  • su开始 bash处理并将其置于后台
  • bash开始 python流程
  • su此时进程可能已完成所有清理并退出(对于人类观察来说几乎是瞬时的)
  • 然后运行 ​​ps ,并观察bashpython进程仍在运行

如果您只想查看python进程正在运行,那么您需要做的就是确保&控制运算符位于传递给 su 的引用命令内:

su root -c "$COMMAND &"

关于bash - Shell脚本运行命令创建多个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23397262/

相关文章:

bash - 出错时自动退出 Bash shell 脚本

linux - 在Linux CLI中按位置替换特定行上的特定字符

linux - 在linux中使用文件作为参数运行脚本

linux - Bash + 从行中删除空格

shell - shell 脚本中的整数表达式预期错误

unix - 查找与模式匹配的行,前提是它们在指定列中的值在输入文件中恰好出现两次

bash - 打乱一个数组,使得没有两个相同的元素相邻

bash - 阻止bash脚本在终端中输出

linux - 从 bash 打开多个 gnome 终端并执行 sudo 服务

linux - 如何在 GNU sed 中结束 `i` 命令?