我有以下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
现在就是这样。
提前致谢。
答案 0 :(得分:2)
在您的第一个场景中,我假设为什么su
和python
进程存在,并且您不清楚为什么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
,并观察仍在运行的bash
和python
进程如果您希望只看到python
进程正在运行,那么您需要做的就是确保&
控制运算符在传递给su
的引用命令中:
su root -c "$COMMAND &"
答案 1 :(得分:0)
这个电话:
su root -c "$COMMAND" &
将su
命令放在后台。我不知道你的python脚本中有什么,但如果你让它在循环中运行,这意味着你放在后台的su将不会返回,直到你传递的命令返回。我假设您将start
传递给您的脚本后,它可能会作为守护程序进程运行,并且不会立即返回。
你有三个进程,因为当你的python继续运行时su不会退出。
第二个按预期工作,因为您将传递给su
的命令作为后台,因此它立即返回su
,因此后台su
可以返回。此外,您不需要退出。