2016-01-07 2 views
0

При использовании Upstart очень важно контролировать подпроцессы (дочерний процесс). Но что смущает меня, как следующий, который вышел за пределы самого выскочку:сколько дочернего процесса (подпроцесса), генерируемого командой su -c

Сценарий 1:

[email protected]:~/Desktop# su cr -c 'sleep 20 > /tmp/a.out' 

меня 3 процесса по: [email protected]:~$ 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:

[email protected]:~/Desktop# su cr -c 'sleep 20' 

я получил 2 процесса по: [email protected]:~$ 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 20 

Процесс sleep 20 один я заботиться, особенно в Upstart, процесс, управляемый Upstart должно быть это пока не bash -c sleep 20 > /tmp/a.out управляется Upstart, в то время как а не sleep 20.

В сценарии 1 выскочка не будет работать правильно, это причина.

Поэтому, почему сценарий 1 получил 3 процесса, для меня это не имеет смысла. Хотя я знаю, что могу использовать команду «exec», чтобы исправить это, я просто хочу получить процедуру, которая произошла, когда две команды были выполнены.

+0

похоже [XY проблема] (http://meta.stackexchange.com/a/66378/137096). Какова ваша фактическая проблема? Забудьте о 'su', какую команду вы хотите использовать, используя' upstart'? Опишите, что вы ожидаете, и что происходит вместо этого. – jfs

ответ

0

su -c запускает оболочку и передает ее через опцию -c. Оболочка может порождать столько процессов, сколько им нравится (это зависит от данной команды).

Он появляется оболочка выполняет команду непосредственно без запуска в некоторых случаях например, при запуске su -c '/bin/sleep $$' то очевидное поведение , как если:

  1. su запускает процесс оболочки (например, /bin/sh)
  2. оболочка получает свой идентификатор процесса (PID) и заменяет $$ с ним
  3. раковина exec()/bin/sleep.

Вы должны увидеть в ps вывод, что аргумент sleep «s равно его PID в этом случае.

Если запустить su -c '/bin/sleep $$ >/tmp/sleep' то /bin/sleep аргумент отличается от его PID (он равен PID предка), то есть:

  1. su запускает процесс оболочки (например, /bin/sh)
  2. оболочка получает собственный идентификатор процесса (PID) и заменить его $$
  3. раковина двойные вилы и exec()/bin/sleep.

Двойная вилка указует на то, что фактическая последовательность событий может быть различными, например, su может дирижирует Разветвляющийся или не разветвление, а не оболочку (я не знаю). Кажется the double fork is there to make sure that the command won't get a controlling terminal.

+0

Действительно умный для использования $$ в качестве аргументов для сна !!! благодаря! А также, принесите мне «двойные вилки», который является настолько ... экспертным уровнем и рад узнать его. – Cross

+0

@Cross: речь идет о двойной вилке и более [о 'setsid()' и убедиться, что процесс не является лидером сеанса (и, следовательно, он не может получить управляющий терминал)] (http://stackoverflow.com/ вопросы/881388/что-это-The-причина-для-исполнительское-а-двойной вилочный когда-создание-а-демон/881415 # comment23366466_881408). Помните, что даже [установленные команды, такие как 'sudo', могут изменять свое поведение, связанное с сеансами/группами процессов/управляющими терминалами] (http://stackoverflow.com/q/34337840/4279) – jfs

0
command > file 

Это не атомное действие и фактически выполнено в 2 процессах.

Один выполняет команду; другой выполняет перенаправление вывода.

Выше два действия не могут быть выполнены в одном процессе.

Я прав?

+0

не оставляйте вопрос в качестве ответа. Если это актуально для текущего вопроса, тогда вместо этого измените свой вопрос (http://stackoverflow.com/posts/34646851/edit). В противном случае задайте новый вопрос. – jfs

Смежные вопросы