Что может быть использовано для создания совершенно отдельного процесса в Bourne Shell (или csh) - PullRequest
1 голос
/ 21 августа 2011

Я тестирую способ запуска процесса отдельно от исходного процесса в sh. Я уже спрашивал и слышал, что & используется для порождения дочернего процесса. Вызывая программу, в данном случае glxgears, потому что в ней много STDOUT (так что я могу проверить, куда идет вывод) с использованием обратных галочек.

glxgears&

не сохраняет вывод из текущей оболочки, где

`glxgears`&

1007 * вызывает *

comp:~ user$ `glxgears`&
[1] 14511
comp:~ user$ X connection to /tmp/launch-dZalNv/org.x:0 broken (explicit kill or server shutdown).

[1]+  Exit 1                  `glxgears`
comp:~ user$

Я принимаю, что [1] 14511 - это просто уведомление о правильном запуске процесса, но как X Server все еще может выводить вывод в мою оболочку? И почему, если я запустил отдельный процесс

[1]+  Exit 1                  `glxgears`

Появляется? Оболочка никогда не предупреждает меня о других процессах закрытия!

Мне кажется, я пришел к выводу, что это может иметь отношение к группе процессов, которая остается идентификатором PID моей оболочки даже после закрытия моей оболочки. Все остальные процессы имеют свою собственную группу процессов. Даже используя

`glxgears&`&

сохраняет PID исходной оболочки в качестве группы процессов!

Я хочу иметь возможность запускать программу (в данном случае glxgears) без какой-либо связи с запускающей оболочкой, без какого-либо вывода.

Если бы вы могли также объяснить, почему X-сервер может отправить мой стартовый процесс, вывод, который будет очень признателен.

Ответы [ 2 ]

3 голосов
/ 21 августа 2011

Попробуйте это:

nohup glxgears >/dev/null 2>&1 &
  • 2>&1 превращает стандартный вывод программы в стандартный вывод.
  • >/dev/null делает stdout равным / dev / null, так что вы ничего не увидите на своем терминале, и программа не получит сигнал boken pipe, если вы закроете свой терминал
  • При nohup программа не завершит свою работу, если родительский элемент завершен
1 голос
/ 22 августа 2011

Вы, похоже, путаете ассоциацию процессов с потоками ввода / вывода.Единственное, что особенного в фоновых процессах, это то, что они возвращают интерактивное управление вызывающей оболочке, не более того.Они по-прежнему используют одни и те же потоки stdout и stderr одного терминала.Куда еще они напишут вывод?Единственным разумным решением было бы (а) полностью отказаться от вывода, (б) указать им какой-нибудь новый файл.Оба считались слишком маловероятными, чтобы быть полезными для поведения по умолчанию, поэтому по умолчанию все еще используется терминал вызывающего процесса для вывода.Вы можете переопределить этот выбор с помощью оператора >, как показал Арно.

...