2017-01-28 5 views
1

У меня есть сценарий, в котором я хотел бы добавить «автоматический» режим, где он будет делать некоторую обработку, сгенерировать некоторый вывод, а затем ввести в фоновом режиме .Как продолжить выполнение скрипта Perl в фоновом режиме?

Как я могу достичь этого безопасно? Будет ли простая вилка и выход из родителя сделать это, или это создаст проблему с зомби (сиротой)?

# initial processing 
defined (my $pid fork) or die "Can't fork: $!"; 
exit if $pid; 
# continue child in background 
+1

Сироты, то есть процессы, в которых родитель больше не существует, обычно автоматически обрабатываются процессом init. Зомби - это другое дело: существует родительский процесс, но он не хочет «ждать» для ребенка, и, таким образом, процесс не полностью готов, даже если он мертв. В вашем случае это будут сироты, поэтому не нужно беспокоиться об этой части. Возможно, вам придется беспокоиться об общих файловых дескрипторах и т. Д. С родителем родительского элемента (например, оболочкой). –

+0

Как указано, это безопасно. Это один из способов поставить что-то в фоновом режиме - вилка и выход из родителя немедленно, а код для запуска - в дочернем. Затем init берет на себя ребенка, и все хорошо (в конце концов пожнет его, когда ребенок закончит). Что вы хотите, чтобы ребенок сделал? Связано ли это с первоначальной обработкой, которая выполняется в родительском объекте до его выхода? – zdim

+0

Спасибо @zdim. Да, связано. Ну, я называю это просто новым режимом для запуска того же самого. В своем «обычном» режиме сценарий извлекает данные, выводит краткое изложение того, что будет сделано, а затем выводит то, что делается на каждом шаге. Я уже реализовал бесшумный режим, но я считаю, что резюме особенно полезно. Таким образом, этот новый «режим» будет работать до тех пор, пока не будет напечатано резюме, тогда, если новая опция была предоставлена, сделайте вилку, убейте родителя, установите молчание и продолжите выполнение. Надеюсь, это хороший способ его реализации. – sidyll

ответ

2

Сирота, то есть процессы, где родительское больше не существует, как правило, автоматически получены с помощью процесса инициализации. Зомби - другое дело: существует родительский процесс, но для ребенка он не заботится wait, и, таким образом, процесс не полностью готов, даже если он мертв. В вашем случае это будут сироты, поэтому не нужно беспокоиться об этой части.

Возможно, вам все равно придется беспокоиться об общих файловых дескрипторах и т. Д. С родителем родителя, если вы выполнили свой процесс из оболочки. Я рекомендую вам также закрыть все дескрипторы файлов, но особенно stdin, stderr и stdout.

+0

Учитывая, что при обычном выполнении мой скрипт не будет закрывать stdin et all, мне интересно, действительно ли этот ребенок должен сделать это после его создания. Я что-то упустил? – sidyll

+0

@sidyll: это, вероятно, актуально только в том случае, если вы запускаете скрипт из интерактивной оболочки и не хотите иметь никаких проблем с плохими взаимодействиями с оболочкой, то есть, как оболочка, останавливающая скрипт, если он записывает на stdout и т. Д. Есть пара других подводных камней в этой области, как выведение контроля за работой снарядов. Я часто видел двойную вилку в сочетании с закрытием std * fd, чтобы полностью отсоединиться от оболочки. –