我正在写一个script.pl调用另一个脚本的Perl脚本(比如说)newscript.pl.我想只获取两个脚本的PID script.pl.我可以script.pl通过使用以下代码获得PID
my $pid = Unix::PID->new();
my @p = $pid->get_pidof( $pid->get_command($$), 1 );
Run Code Online (Sandbox Code Playgroud)
在此之后我打电话system来执行newscript.pl
system("perl newscript.pl");
Run Code Online (Sandbox Code Playgroud)
我想捕捉这样产生的PID newscript.pl在script.pl.
到时间system返回时,生成的进程已经退出,将其pid留作有趣的历史参考 - 例如,对日志分析很有用.
system LIST
system PROGRAM LIST完全相同的事情
exec LIST,除了afork先完成并且父进程等待子进程退出 ...
如果你想两者的PID script.pl和newscript.pl,fork和自己管理自己的寿命.有关您正在处理的问题的更具体信息,我们可以为您提供更具体的建议.
要阻止程序的其他实例,常见的技术是使用操作系统的工具进行协作锁定:在启动时,尝试锁定某个文件.如果成功,您的程序就会知道它是唯一的一个.否则,另一个进程已经锁定,因此新进程退出.请参阅下面的示例.
#! /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.";
Run Code Online (Sandbox Code Playgroud)
请注意,take_lock当控件位于关键部分内时,必须保持文件句柄保持打开状态.上面的代码将其视为不透明令牌.程序退出时,Perl会关闭文件句柄,自动释放锁定.你不想做的是调用take_lockvoid上下文,因为这会丢弃你的锁.
| 归档时间: |
|
| 查看次数: |
6741 次 |
| 最近记录: |