Нужно создать сиротский процесс в perl - PullRequest
0 голосов
/ 20 февраля 2020

HI Я пытаюсь выполнить код, разветвив дочерний процесс.

У меня есть ruby код a.rb, в котором я использую системный вызов

system ("perl ab c .pl -subroutine = 'a' -command = 'b '-status =' c '-logfile =' d '-start_datetime =' e '")

сейчас в ab c .pl я делаю это

my $pid = fork;
if (!$pid) {
    print "[INFO] in the child process \n ";    
    print "[INFO] forking worked, child process id: ($$) \n";
    while (1) { 
    if ( -d "$ENV{OUT_HOME}" ) {
        print "[INFO] $ENV{OUT_HOME} is available now to write $seq \n";
        open(my $FH,'>',"$ENV{OUT_HOME}/SEQ") or die "cannot open file to write $seq into $ENV{OUT_HOME}/SEQ";
        print $FH "$seq";
        close $FH; 
        print "[INFO] exiting from forked child process id: ($$)  \n";
        exit; # exit the while loop
    } 
    else {
        sleep (2);  
    }
  }
} else {
    print "[INFO] I am parent Process exiting from here \n";
    exit;
}

Теперь с этим я пытаюсь получить дочерний процесс, который не зависит от родительского процесса (здесь это ab c .pl). Когда я запускаю сценарий, он выполняет системную команду, которая выполняет сценарий perl, и я вижу perl скрипт в дереве процессов. Но я продолжаю висеть там. Я не уверен, почему системная команда не завершается после завершения родительского? любые предложения или комментарии приветствуются.

Ответы [ 2 ]

1 голос
/ 21 февраля 2020

Это решено в perlfaq8 :

Как мне разветвлять процесс демона?

Если вы имеете в виду процесс демона тот, который отсоединен (не связан с его tty), затем, как сообщается, следующий процесс работает на большинстве систем Unixi sh. Пользователи, не являющиеся Unix, должны проверить свой модуль Your_OS :: Process на наличие других решений.

Откройте / dev / tty и используйте на нем TIOCNOTTY ioctl. Смотрите tty (1) для деталей. Или, что еще лучше, вы можете просто использовать функцию POSIX::setsid(), чтобы вам не приходилось беспокоиться о группах процессов.

Измените каталог на /

Снова откройте STDIN, STDOUT и STDERR, чтобы они не подключены к старому tty.

Фон себя так:

fork && exit;

Модуль Pro c :: Daemon , доступный в CPAN, предоставляет функцию для выполнения этих действий за вас.

Как указано в FAQ, модуль Pro c :: Daemon может упростить это для вас, хотя это только один из нескольких модулей, доступных для этой задачи.

1 голос
/ 20 февраля 2020

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

Попробуйте это (при условии, что переменная окружения OUT_HOME была установлена ​​в папку перед вызовом perl):

my $pid = fork;
if (!$pid) {
    print "[INFO] in the child process \n ";    
    print "[INFO] forking worked, child process id: ($$) \n";
    require POSIX;
    POSIX::setsid();
    while (1) { 
    if ( -d "$ENV{OUT_HOME}" ) {
        print "[INFO] $ENV{OUT_HOME} is available now to write $seq \n";
        open(my $FH,'>',"$ENV{OUT_HOME}/SEQ") or die "cannot open file to write $seq into $ENV{OUT_HOME}/SEQ";
        print $FH "$seq";
        close $FH; 
        print "[INFO] exiting from forked child process id: ($$)  \n";
        exit; # exit the while loop
    } 
    else {
        sleep (2);  
    }
  }
} else {
    print "[INFO] I am parent Process exiting from here \n";
    exit;
}
...