Shell 由';su-c命令';

Shell 由';su-c命令';,shell,subprocess,upstart,Shell,Subprocess,Upstart,使用Upstart时,控制子进程(子进程)非常重要。但让我困惑的是,这已经超越了暴发户本身: 场景1: root@ubuntu-jstorm:~/Desktop# su cr -c 'sleep 20 > /tmp/a.out' root@ubuntu-jstorm:~/Desktop# su cr -c 'sleep 20' 我通过:cr@ubuntu-jstorm:~$ps-ef | grep-v grep | grep sleep root 8026 6544

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

场景1:

root@ubuntu-jstorm:~/Desktop# su cr -c 'sleep 20 > /tmp/a.out'
root@ubuntu-jstorm:~/Desktop# su cr -c 'sleep 20'
我通过:
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
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
场景2:

root@ubuntu-jstorm:~/Desktop# su cr -c 'sleep 20 > /tmp/a.out'
root@ubuntu-jstorm:~/Desktop# su cr -c 'sleep 20'
我通过:
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
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”来修复它,但我只想知道当两个命令提交时发生了什么

command > file
这不是原子行为,实际上是在2个过程中完成的

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

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


我说的对吗?

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

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

  • su
    启动shell进程(例如,
    /bin/sh
  • shell获得自己的进程id(PID)并用它替换
    $
  • shell
    exec()
    /bin/sleep
  • 您应该在
    ps
    输出中看到
    sleep
    的参数在本例中等于其pid

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

  • su
    启动shell进程(例如,
    /bin/sh
  • shell获得自己的进程id(PID)并用它替换
    $
  • shell双叉和
    exec()
    /bin/sleep

  • 双分叉表示事件的实际顺序可能不同,例如,
    su
    可以编排分叉或不分叉,而不是shell(我不知道)。似乎是这样。

    不要将问题作为答案发布。如果它与当前问题相关,那么。否则,请提出一个新问题。它看起来像。你的实际问题是什么?忘记
    su
    ,使用
    upstart
    运行什么命令?描述你期望发生什么,以及会发生什么。使用$$作为睡眠参数真的很聪明!!!谢谢还有,带上“双叉”给我,这是如此……专家级的,很高兴学习。@Cross:双叉的内容更少,更多。甚至要当心