Могу ли я захватить вывод другого запущенного процесса? - PullRequest
0 голосов
/ 19 ноября 2018

В настоящее время я использую > /dev/null &, чтобы скрипт Perl A запускал скрипт Perl B совершенно независимо, и он отлично работает. Скрипт B запускается без возврата каких-либо выходных данных и остается в силе после завершения скрипта A, даже когда мой терминальный сеанс заканчивается.

Не говорю, что мне это нужно, но есть ли способ вернуть его результат, если бы я хотел?

Спасибо

1 Ответ

0 голосов
/ 20 ноября 2018

Ваша структура кода может выглядеть так:

#!/usr/bin/perl
# I'm a.pl
#...
system "b.pl > ~/b.out &";
while (1)
{
    my $time = localtime;
    my ($fsize, $mtime) = (stat "/var/log/syslog")[7,9];
    print "syslog: size=$fsize, mtime=$mtime at $time\n";
    sleep 60;
}

, в то время как b.pl может выглядеть так:

#!/usr/bin/perl
# I'm b.pl
while (1)
{
    my $time = localtime;
    my $fsize_a = (stat "/var/log/auth.log")[7];
    my $fsize_s = (stat "/var/log/syslog")[7];
    print "fsize: syslog=$fsize_s auth.log=$fsize_a at $time\n";
    sleep 60;
}
  • a.pl и b.pl делают ихСамостоятельное задание.
  • b.pl вызывается a.pl как фоновое задание, которое отправляет свой вывод b.out (не портит экран a.pl)
  • Вы можете прочитать b.out с другого терминала, или после того, как a.pl будет завершен (или когда a.pl временно переведен в фоновый режим)

О прекращении работы двух сценариев:

  • `ctrl-c` для a.pl
  • ` killall b.pl` для b.pl

Примечание:

  • b.pl никогда не прекратится дажекогда вы завершаете работу своего терминала (при условии, что ваш терминал запущен как настольное приложение), вам не нужна команда `nohup`.(Возможно, полезно только в консоли)
  • Если ваш b.pl может время от времени выплевывать сообщения об ошибках, то вам все равно придется иметь дело с его stderr.Это оставлено как твоя домашняя работа.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...