我正在使用 perl 版本 5.8.4。
我正在使用一个名为 JMP 的程序。在打开程序之前,我想使用 perl 检查程序的进程是否已经在运行。如果它正在运行,我想关闭它。
使用我从其他人那里得到的关于这个问题的有用输入,重写答案以更适合手头的问题。
它检查进程是否正在运行,使您能够做的不仅仅是杀死它(打印输出到控制台,如果需要,杀死它的子进程等),killall
仅在程序正在运行时运行,然后启动jmp
。
#!/usr/bin/perl
use warnings;
use strict;
# Read all script-name processes
open PROS, "ps -ef| grep jmp |";
# Iterate the processes
while ($line = <PROS>){
# If we match the process, kill all instances
unless ($line =~ m/grep/){
system 'killall jmp';
last;
}
}
# Finished with the processes
close PROS;
# Start jmp
exec 'nohup /path/to/jmp &';
如果您使用的是 Windows,则需要查看taskkill
而不是killall
.
您只需添加以下内容:
use autodie 'system';
system('killall', '-q', 'JMP');
或者
use autodie 'system';
system('pkill', 'JMP');
如果您想自己处理错误检查而不是使用 autodie,它看起来像
die "Can't launch killall: $!\n" if $? < 0;
die "killall killed by signal ".($? & 0x7F)."\n" if $? & 0x7F;
die "killall exited with error ".($? >> 8)."\n" if $? >> 8;
返工:(我知道我是怎么到这里的,我只是迷路了)
这仅适用于 Windows,原因是 shell 执行(Taskkill)。
system('taskkill /F /IM ImageName.exe >nul 2>&1');
可能的重复:
perl > 系统文档:
http://perldoc.perl.org/functions/system.html
任务杀戮文档:
关于语法重定向(基于How can I kill a program that may not exist from Perl on Win32? 的 awnser?):