Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在perl程序为';你不跑步吗?_Perl_Shell - Fatal编程技术网

如何在perl程序为';你不跑步吗?

如何在perl程序为';你不跑步吗?,perl,shell,Perl,Shell,我已经像执事一样运行了一个perl程序, perl check.pl& 现在,我可以检查perl程序的运行状态,但是当perl程序不运行时,如何修改shell脚本以运行perl程序呢 a=`ps -ef | grep "perl" | grep "check" |awk '{print $2}'` for p in $a do echo perl echo $p done 您可以让perl自己运行check,并通过系统crontab定期调用

我已经像执事一样运行了一个perl程序, perl check.pl&

现在,我可以检查perl程序的运行状态,但是当perl程序不运行时,如何修改shell脚本以运行perl程序呢

    a=`ps -ef | grep "perl" | grep "check" |awk '{print $2}'`
    for p in $a
    do
      echo perl
      echo $p
   done

您可以让perl自己运行check,并通过系统crontab定期调用它

use Fcntl ':flock';
flock(DATA, LOCK_EX|LOCK_NB) or die "Already running..\n";

# ...


__DATA__
所以

  • 我已经运行了一个类似deamon的perl程序perl check.pl&
这不像一个守护进程,而是一个简单的后台进程。每个进程都有一个父进程。后台进程(如上所述)将“bash”作为父进程发送到bakcground,因此bash可以
等待它的终止。守护进程有一个名为
init
的父进程,
PID==1
,因此它由
init
监视

  • 现在,我可以检查perl程序的运行状态
是的,因为您可以检查任何其他程序的状态。有一条评论说,对程序名执行grep会产生一些奇怪的副作用,比如:

$ perl log.pl &
现在,将
ps
的输出变大将导致两个“日志”进程,其中一个将是
syslogd
进程。当然,在您的示例中,您仅将另一个
grep
限制为
perl
,但代价是两个进程

您可以使用一些更智能的grep参数将两个进程限制为一个,如

ps -ef | grep 'perl check'
上面的搜索将使用一个进程,字符串“perl-check”。不幸的是,这将发现
grep
进程本身,如

$ perl check.pl &
$ ps -ef | grep 'perl check
  501 45063 42171   0 11:26   ttys001    0:00.00 grep perl check
  501 45002 44504   0 11:21   ttys002    0:00.02 perl check.pl
一个很好的解决方法是使用类似于

grep '[p]erl check'

  • 但是,当perl程序没有运行时,如何修改shell脚本以运行perl程序呢
如果对
ps
的输出进行grepping时没有返回任何内容,则应启动脚本。你应该检查你的
a
的内容(你真的应该给它起个更好的名字叫
a
,比如
perlPID
之类)。如果
-z
的参数长度为零,则返回“true”,因此:


您可以使用cronjob每隔n分钟检查一次程序是否正在运行,如果没有,则重新启动它。但为此,您应该使其成为一个真正的系统守护进程。Daemon::Control是一个perl模块,有助于创建这样的守护程序。可能有其他的选择,但这是一个我正在使用一段时间了。你想实现什么?你有root/admin权限吗?
$ perl check.pl &
$ ps -ef | grep '[p]erl check'
  501 45002 44504   0 11:21   ttys002    0:00.02 perl check.pl
[[ -z "$a" ]] && perl check.pl &