プログラムが実行中かどうかを確認し、そうでない場合はこのプログラムを実行する方法を知りたいと思います。プログラムが実行されているかどうかをチェックし、perl以外の場合は実行してください
答えて
kill機能を使用して確認するプロセスIDに0(ゼロ)信号を送信します。プロセスが存在する場合、関数はtrueを返し、そうでない場合はfalseを返します。
例:
#-- check if process 1525 is running
$exists = kill 0, 1525;
print "Process is running\n" if ($exists);
あなたは、システムコールを使用してコマンドラインからあなたのような任意のプログラムを呼び出すことができます。これは、プログラムの出力をキャプチャする必要がない場合にのみ便利です。
#!/usr/bin/perl
use strict;
use warnings;
my $status = system("vi fred.txt");
それとも、シェルが関与したくない場合:
別の答えと同様に#!/usr/bin/perl
use strict;
use warnings;
my $status = system("vi", "fred.txt");
、しかし、あなたは確認してくださいとgrepと一致しないために「はgrep -v grepの」を使用する必要がありますそれ自身を呼び出します。これは、あなたがしたくないときにあなたが本当に評価していないことを保証します。私たちは、Linux上のpidファイル起動デーモンの内容に基づいて、デーモンが動作しているかどうかを確認するためにこれを使用
use strict;
use warnings;
my($cmd, $process_name) = ("command here", "process name here");
if(`ps -aef | grep -v grep $process_name`) {
print "Process is running!\n";
}#if
else {
`$cmd &`;
}#else
この回答は* nixでのみ機能します。ビルトインコマンドとCPANモジュールを使用する主なポイントの1つは、ほとんどの場合、移植性を気にする必要がないことです。 'kill 0、$ pid'オプションは、Windowsのような他のOSで動作します。 :-) –
私は 'pgrep'を使うだけで、実行中のプロセスをグロッピングするのはとても一般的だと思います。 –
:
#!/usr/local/bin/perl
use strict;
use warnings;
use feature qw/ say /;
# vars we report
my (
$token, # optional arg - check against cmd_line if specified
$pid_file, # daemon pid-file, e.g. /var/run/mysqld/mysqld.pid
$pid, # the pid to investigate...
$pid_running, # found a pid and it is running
$cmd_line, # cmd_line of the running pid
$result, # 0-OK, 1=FAIL, exit value
$error, # error message if necessary
);
# working vars
my ($fh, $cmd_file);
die "Daemon pid-file required" unless scalar @ARGV >= 1;
($pid_file, $token) = @ARGV;
if (-s $pid_file) {
open($fh, "<", $pid_file) or die "open $pid_file: $!";
($pid) = <$fh>; chomp $pid; close $fh;
$pid_running = kill 0, $pid;
if ($pid_running) {
$cmd_file = "/proc/$pid/cmdline";
local($/) = "\0"; # C-String NULL terminated
open($fh, "<", $cmd_file) or die "open $cmd_file: $!";
($cmd_line) = <$fh>; close $fh;
if ($cmd_line && $token && $cmd_line !~ m/$token/) {
$error = "token not found: $token in $cmd_line";
}
}
else {
$error = "process not found: $pid";
}
}
else {
$error = "file not found: $pid_file";
}
# if TOKEN - OK running process with matching cmdline
$result = $token ? ($pid_running && $cmd_line && $cmd_line =~ m/$token/)
: ($pid_running || 0);
say "token: ", $token if $token;
say "file: ", $pid_file;
if ($pid) {
say "pid: ", $pid;
say "running: ", $pid_running;
say "cmdline: ", $cmd_line if $cmd_line;
}
say "error: ", $error if $error;
say "exit: ", $result ? 'ok' : 'fail';
exit $result;
を私は「0を殺す...」しようとしたもので、それはあなたがプロセスへのアクセス許可を持っていない場合は動作しません。 "kill 0"はが可能であるかどうかをチェックするだけです。はシグナルを送信します。あなたの権限がないので(あなたのUIDは0でなく、プロセスもUIDではありません)、あなたは常にfalseになります。
私もPIDディレクトリがあるかどうかだけをチェックするために、Linuxでのアカウントの/ proc /に撮ってみましたが、その部分は非常に移植性がありません:Linuxのために良いが、実際にせずに別の場所UNIXで動作しません。追加の愛。
だから私はこのサブを書いた、HTH:それはまた、プロセスの所有者があなたを返すよう
sub is_running() {
my $pid = shift;
my @proc_data = split(/\s+:\s+/,
`ps uax | awk '{print \$1,":",\$2}' | grep $pid`);
return (@proc_data && $proc_data[1] == $pid) ? $proc_data[0] : undef;
}
使用法は、簡単で、かなり便利です。
my $pid = 12345;
my $owner = &is_running($pid);
if ($owner) {
print "Process with PID $pid is running and owned by \"$owner\".\n";
}
は、お楽しみに! $pid
が空の場合:)
、プロセスが実行されていない:あなたは
my $pid = `ps -C $progname -o pid=`; # non-windows solution, sorry
どのオペレーティングシステムを使用していますか? –
Debian 6ですが、問題は解決しました。 – Luke