我有以下 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
就像现在一样。
提前致谢。
最佳答案
在你的第一个场景中,我认为很清楚为什么 su
和python
进程存在,并且您不清楚为什么 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
,并观察bash
和python
进程仍在运行
如果您只想查看python
进程正在运行,那么您需要做的就是确保&
控制运算符位于传递给 su
的引用命令内:
su root -c "$COMMAND &"
关于bash - Shell脚本运行命令创建多个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23397262/