加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何获得使用Perl系统函数生成的进程的PID?

发布时间:2020-12-15 21:53:31 所属栏目:大数据 来源:网络整理
导读:我正在写一个调用另一个脚本newscript.pl的Perl脚本(比如script.pl).我想只在script.pl中获取这两个脚本的PID.我可以使用以下代码获取script.pl的PID my $pid = Unix::PID-new();my @p = $pid-get_pidof( $pid-get_command($$),1 ); 在此之后我调用系统来执
我正在写一个调用另一个脚本newscript.pl的Perl脚本(比如script.pl).我想只在script.pl中获取这两个脚本的PID.我可以使用以下代码获取script.pl的PID
my $pid = Unix::PID->new();
my @p = $pid->get_pidof( $pid->get_command($$),1 );

在此之后我调用系统来执行newscript.pl

system("perl newscript.pl");

我想在script.pl中捕获这个newscript.pl生成的PID.

解决方法

到系统返回时,生成的进程已经退出,将其pid留作有趣的历史参考 – 例如,对日志分析很有用.

system LIST
system PROGRAM LIST

Does exactly the same thing as exec LIST,except that a fork is done first and the parent process waits for the child process to exit

如果你想要script.pl和newscript.pl的pids,请自己分叉并管理它们的生命周期.有关您正在处理的问题的更具体信息,我们可以为您提供更具体的建议.

要阻止程序的其他实例,常见的技术是使用操作系统的工具进行协作锁定:在启动时,尝试锁定某个文件.如果成功,您的程序知道它是唯一的.否则,另一个进程已经锁定,因此新进程退出.请参阅下面的示例.

#! /usr/bin/env perl

use strict;
use warnings;

use Fcntl qw/ :flock /;
use File::Basename;
use POSIX qw/ strftime /;

$0 = basename $0;

my $LOCK = "$ENV{HOME}/.lock-$0";

sub logmsg {
  my($msg) = @_;
  my $t = strftime "%F %T",localtime time;
  warn "$0: $t - $$- $msgn";
}

sub take_lock {
  open my $fh,">",$LOCK or die "$0: open $LOCK: $!";

  unless (flock $fh,LOCK_EX | LOCK_NB) {
    logmsg "failed to lock $LOCK; exiting.";
    exit 1;
  }

  $fh;
}

my $token = take_lock;
logmsg "processing...";
sleep 2 * 60;
logmsg "done.";

请注意,当控件位于critical section内时,必须保持take_lock返回的文件句柄处于打开状态.上面的代码将其视为不透明令牌.程序退出时,Perl会关闭文件句柄,自动释放锁定.你不想做的是在void上下文中调用take_lock,因为这会丢弃你的锁.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读