在使用Upstart时,控制子进程(子进程)非常重要。但让我感到困惑的是,它已经超越了暴发户本身:
场景1:
root@ubuntu-jstorm:~/Desktop# su cr -c 'sleep 20 > /tmp/a.out'我得到了三个进程:cr@ubuntu-jstorm:~$ ps -ef | grep -v grep | grep sleep
root 8026 6544 0 11:11 pts/2 00:00:00 su cr -c sleep 20 > /tmp/a.out
cr 8027 8026 0 11:11 ? 00:00:00 bash -c sleep 20 > /tmp/a.out
cr 8028 8027 0 11:11 ? 00:00:00 sleep 20场景2:
root@ubuntu-jstorm:~/Desktop# su cr -c 'sleep 20'我得到了两个进程:cr@ubuntu-jstorm:~$ ps -ef | grep -v grep | grep sleep
root 7975 6544 0 10:03 pts/2 00:00:00 su cr -c sleep 20
cr 7976 7975 0 10:03 ? 00:00:00 sleep 20sleep 20的过程是我关心的,特别是在Upstart中,Upstart管理的进程应该是这个,而不是bash -c sleep 20 > /tmp/a.out由Upstart管理,而不是sleep 20。
在场景1中,upstart将不能正常工作,以上就是原因。
因此,为什么场景1有3个过程,这对我来说是没有意义的。尽管我知道我可以使用命令'exec‘来修复它,但我只想知道当两个命令提交时发生了什么。
发布于 2016-01-07 07:28:52
su -c启动shell并通过其-c选项传递命令。shell可以生成任意数量的进程(取决于给定的命令)。
在某些情况下,shell似乎直接执行命令而不分叉,例如,如果您运行su -c '/bin/sleep $$',那么表面上的行为就好像
su启动一个shell进程(例如,/bin/sh)$$。exec() /bin/sleep.您应该在ps输出中看到,在这种情况下,sleep的参数等于它的pid。
如果运行su -c '/bin/sleep $$ >/tmp/sleep',那么/bin/sleep参数不同于它的PID (它等于祖先的PID),即:
su启动一个shell进程(例如,/bin/sh)$$。exec() /bin/sleep。双叉表示实际事件的顺序可能不同,例如,su可以编排分叉或不分叉,而不是shell (我不知道)。似乎是the double fork is there to make sure that the command won't get a controlling terminal。
发布于 2016-01-07 06:44:08
command > file这不是原子操作,实际上是在两个过程中完成的。
一个是执行命令;另一个是执行输出重定向。
以上两个动作不能在一个过程中完成。
我说的对吗?
https://stackoverflow.com/questions/34646851
复制相似问题