首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“su -c命令”生成多少子进程(子进程)

“su -c命令”生成多少子进程(子进程)
EN

Stack Overflow用户
提问于 2016-01-07 03:22:15
回答 2查看 321关注 0票数 0

在使用Upstart时,控制子进程(子进程)非常重要。但让我感到困惑的是,它已经超越了暴发户本身:

场景1:

代码语言:javascript
复制
root@ubuntu-jstorm:~/Desktop# su cr -c 'sleep 20 > /tmp/a.out'

我得到了三个进程:cr@ubuntu-jstorm:~$ ps -ef | grep -v grep | grep sleep

代码语言:javascript
复制
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:

代码语言:javascript
复制
root@ubuntu-jstorm:~/Desktop# su cr -c 'sleep 20'

我得到了两个进程:cr@ubuntu-jstorm:~$ ps -ef | grep -v grep | grep sleep

代码语言:javascript
复制
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 20

sleep 20的过程是我关心的,特别是在Upstart中,Upstart管理的进程应该是这个,而不是bash -c sleep 20 > /tmp/a.out由Upstart管理,而不是sleep 20

在场景1中,upstart将不能正常工作,以上就是原因。

因此,为什么场景1有3个过程,这对我来说是没有意义的。尽管我知道我可以使用命令'exec‘来修复它,但我只想知道当两个命令提交时发生了什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-07 07:28:52

su -c启动shell并通过其-c选项传递命令。shell可以生成任意数量的进程(取决于给定的命令)。

在某些情况下,shell似乎直接执行命令而不分叉,例如,如果您运行su -c '/bin/sleep $$',那么表面上的行为就好像

  1. su启动一个shell进程(例如,/bin/sh)
  2. shell获得自己的进程id (PID),并用它替换$$
  3. exec() /bin/sleep.

您应该在ps输出中看到,在这种情况下,sleep的参数等于它的pid。

如果运行su -c '/bin/sleep $$ >/tmp/sleep',那么/bin/sleep参数不同于它的PID (它等于祖先的PID),即:

  1. su启动一个shell进程(例如,/bin/sh)
  2. shell获得自己的进程id (PID),并用它替换$$
  3. 贝壳双叉和exec() /bin/sleep

双叉表示实际事件的顺序可能不同,例如,su可以编排分叉或不分叉,而不是shell (我不知道)。似乎是the double fork is there to make sure that the command won't get a controlling terminal

票数 0
EN

Stack Overflow用户

发布于 2016-01-07 06:44:08

代码语言:javascript
复制
command > file

这不是原子操作,实际上是在两个过程中完成的。

一个是执行命令;另一个是执行输出重定向。

以上两个动作不能在一个过程中完成。

我说的对吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34646851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档