Linux запускает дочерний процесс с перенаправлением, не вызывая новый процесс - PullRequest
1 голос
/ 20 апреля 2011

Я использую ruby ​​для запуска фонового сервиса. Я сохраняю PID для этого сервиса, чтобы прекратить его позже. Допустим, для простоты мне нужно запустить фоновый сервис "sleep 1000". Я использую эту команду, и она работает правильно

child_pid = fork {exec("sleep 1000")} # => 7845

ps  
7845 pts/15   00:00:00 sleep

child_pid хранит PID сна. Однако когда я пытаюсь перенаправить стандартный вывод в файл (для ведения журнала), он ведет себя по-другому.

child_pid = fork {exec("sleep 1000 > sleep.log")} # => 7829

В этом случае child_pid - это PID процесса sh, а процесс ожидания принимает другой PID.

ps  
7829 pts/15   00:00:00 sh  
7832 pts/15   00:00:00 sleep

Есть ли объяснения этому?

1 Ответ

1 голос
/ 20 апреля 2011

Когда вы используете простую команду, ее можно запустить напрямую. Перенаправления (и переменные окружения, и ;, и каналы, и ряд других вещей) не являются простыми командами; они являются синтаксисом оболочки, поэтому Ruby запускает оболочку для их обработки. Если вы хотите избежать этого, вам нужно выполнить перенаправление в Ruby в дочернем процессе fork ed до exec, открыв стандартный вывод для файла перенаправления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...