我正在写一个调用另一个脚本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@H_502_5@
system("perl newscript.pl");
解决方法
到系统返回时,生成的进程已经退出,将其pid留作有趣的历史参考 – 例如,对日志分析很有用.
system LIST
system PROGRAM LIST
@H_502_5@Does exactly the same thing as
exec LIST
,except that afork
is done first and the parent process waits for the child process to exit …@H_502_5@
如果你想要script.pl和newscript.pl的pids,请自己分叉并管理它们的生命周期.有关您正在处理的问题的更具体信息,我们可以为您提供更具体的建议.@H_502_5@
要阻止程序的其他实例,常见的技术是使用操作系统的工具进行协作锁定:在启动时,尝试锁定某个文件.如果成功,您的程序知道它是唯一的.否则,另一个进程已经锁定,因此新进程退出.请参阅下面的示例.@H_502_5@
#! /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 - $$- $msg\n"; } 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,因为这会丢弃你的锁.@H_502_5@