2016-02-18 3 views
0

Я использую Mono в системе Linux для запуска процесса. Случайно родительский процесс умирает безвременной кончиной и берет с собой детский процесс, но мне нужно продолжать процесс ребенка.
При тестировании каждый вариатор System.Diagnostics.Process.Start(), который я тестировал, заставит его дочерний процесс умереть, когда я убью родительский процесс. Есть ли какие-то настройки, которые мне не хватает, или еще один способ добиться этого? В качестве теста, это:
Как сделать вызов MONO() для запуска процесса, который не умирает, когда он умирает?

System.Diagnostics.Process.Start(new ProcessStartInfo("journalctl", "-f") {UseShellExecute = true}); 


это:

System.Diagnostics.Process.Start(new ProcessStartInfo("journalctl", "-f") {UseShellExecute = false}); 

и это:

System.Diagnostics.Process.Start("journalctl", "-f"); 

запустит 'journalctl' ('пс -aef' указывает правильные идентификаторы родителя-ребенка), и когда я убью родительский процесс , 'journalctl' также умирает.
Должен ли я запускать скрипт, который использует nohup и отключает дочерний процесс?

ответ

0

Полная деассоциация дочернего процесса от родителя требует выполнения системных вызовов дочерним процессом; это может быть проще сделать через оболочку оболочки, если у МОНО нет доступа к соответствующим системным вызовам (fork, чтобы сначала создать дочерний процесс, а затем setsid, чтобы избежать родительской группы процессов, имея дело со стандартными вводами и стандартными дескрипторами выходных файлов, возможно, chdir - /, и все остальное, что я забыл). Ваши вызовы MONO выглядят более похожими на системный вызов system(3), что также потребует использования программы-обертки для setsid и т. Д.

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