Я хочу знать, как проверить, работает ли программа и запускать эту программу, если нет.
Проверьте, запущена ли программа, и запустите ее, если не в perl
Ответ 1
Отправьте 0 (нулевой) сигнал на идентификатор процесса, который вы хотите проверить, используя функцию kill. Если процесс существует, функция возвращает значение 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");
Ответ 2
Подобно другому ответу, но вам нужно убедиться и использовать grep -v grep, чтобы он не соответствовал самому вызову grep. Это гарантирует, что вы не оцениваете значение true, когда вы этого не хотите.
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
Ответ 3
Я попытался "убить 0...", но это не сработает, если у вас нет разрешения на этот процесс, так как "kill 0" проверяет, можно ли отправить сигнал. Поскольку у вас нет разрешения на это (ваш UID не равен 0, а процесс также не является идентификатором UID), вы получите всегда false.
Я также попытался перейти к учетной записи/proc/в Linux, чтобы просто проверить, существует ли каталог PID, но эта часть не очень переносима: хорошо для Linux, но на самом деле не работает в другом месте в UNIX без дополнительного любовь.
Итак, я написал этот sub, 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";
}
Удачи!:)
Ответ 4
Если $pid
пуст, процесс не запущен:
my $pid = `ps -C $progname -o pid=`; # non-windows solution, sorry
Ответ 5
Мы используем это, чтобы проверить, запущен ли демон, на основе содержимого запуска pid файла daemon в Linux:
#!/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;