2

バックグラウンド ジョブを開始してログ情報をファイルに出力し、何かを実行して終了する Perl スクリプトがあります。

スクリプトが完了したらバックグラウンド プロセスを終了したいのですが、私が知る限り、以下のようにダブル フォークを使用するwaitpid($pid,0) と、バックグラウンド プロセスが強制終了されるのではなく、終了するのを待ちkill(9,$pid)ます。バックグラウンドプロセスを取り除きます。

スクリプト例:

#!/usr/bin/perl
use strict;

# Do a first general top
my $ret = `top -b -n 1 > logfile`;

# Do a background $USER top every minute
my $cmd = "top -b -d 60 -n 300 -u $ENV{USER} >> logfile";
my $pid;
unless ($pid = fork) {
  unless (fork) {       #second_fork
    exec "$cmd";
    die "exec failed!";
  }                     #second_fork
  exit 0;
}

# Script does something else for 1-2 hours
# [...]
# We are finished now, let's finish the logging

# waitpid($pid,0) would wait until top command is finished
force_background_job_to_finish($pid) if (background_job_still_running($pid));

# Add final top to the end
$ret = `top -b -n 1 >> logfile`;

1;

方法はありforce_background_job_to_finishますか?

4

2 に答える 2