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

时间:2014-04-30 20:16:52

标签: 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启动进程的位置。

无论如何我可以将进程运行到一个吗?另外,我如何更改进程名称,使其看起来如下所示:

 4793 myservice

而不是

 4793 python myservice.py start

现在就是这样。

提前致谢。

2 个答案:

答案 0 :(得分:2)

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

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

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

su分叉并简单地调用execve()系统调用给定的程序路径和参数,但是如果是这样的话,很多shell功能都会丢失 - 或者你和#39; d必须明确调用su root -c "/bin/bash -c <non-trivial command>"


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

  • su启动并置于后台
  • su启动bash进程并将其置于后台
  • bash启动python流程
  • su进程可能已经完成了这一点的任何清理并退出(几乎瞬间到人类观察)
  • 然后,您运行ps,并观察仍在运行的bashpython进程

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

su root -c "$COMMAND &"

答案 1 :(得分:0)

这个电话:

su root -c "$COMMAND" &

su命令放在后台。我不知道你的python脚本中有什么,但如果你让它在循环中运行,这意味着你放在后台的su将不会返回,直到你传递的命令返回。我假设您将start传递给您的脚本后,它可能会作为守护程序进程运行,并且不会立即返回。

你有三个进程,因为当你的python继续运行时su不会退出。

第二个按预期工作,因为您将传递给su的命令作为后台,因此它立即返回su,因此后台su可以返回。此外,您不需要退出。