从perl脚本中终止进程
我试图通过名称杀死一个进程,并将其作为变量传递给系统命令 以下是我所拥有的:从perl脚本中终止进程,perl,system,pid,kill,Perl,System,Pid,Kill,我试图通过名称杀死一个进程,并将其作为变量传递给系统命令 以下是我所拥有的: my $processName=$ARGV[0]; print "$processName\n"; system(q/kill -9 `ps -ef | grep '$processName' | grep -v grep | awk '{print $2}'`/); 上面的脚本抛出一个错误: kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jo
my $processName=$ARGV[0];
print "$processName\n";
system(q/kill -9 `ps -ef | grep '$processName' | grep -v grep | awk '{print $2}'`/);
上面的脚本抛出一个错误:
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
但是,如果我在系统命令中直接输入进程名称,它就可以工作
有人能帮我一下吗?您有不同的变量
$processName
和$jobName
,所以整个`
表达式都是空的。他会指出这一点;它甚至对三行脚本也很有用。kill
错误消息是在没有任何参数的情况下运行它时得到的消息
专业提示:如果存在,您可以用一个命令替换整个有问题的hack。一个问题是,根据设计,调用脚本的命令行具有您随后查询的进程的名称;因此,我们发现的一件事就是脚本本身 这是可以防范的,但为什么要用这么大的管道进入系统呢 用Perl查询进程,例如使用 请注意,通过发送进程
SIGTERM
(通常为15),而不是SIGKILL
,来“杀死”进程要好得多
寻找一个进程“名称”可能是危险的,因为在现代系统上运行的许多进程都有很长的命令行,其中可能包含这个词。代码使用您的需求,只需通过提交的名称进行查询,但我建议通过额外的检查来加强这一点
有关模块可以查询的许多流程详细信息,请参见其
即使您希望自己解析流程表,我也只会得到ps-ef
,然后在脚本中解析它。这给了你更多的灵活性来确保你真正终止你想要的
my $pid = `ps -ef | grep '$processName' | grep -v grep | awk '{print \$2}'`;
print $pid;
system("kill -9 $pid");
这个有效 您可以使用以下方法按名称终止进程,而无需调用shell: 或者,您可以先收集进程ID列表:
use IPC::System::Simple qw(capturex EXIT_ANY);
kill 9, capturex(EXIT_ANY, 'pgrep', '--', $processName));
那你就不用担心了。请参见daxim。调用脚本的命令(
script proc name
或类似命令)中存在$processName
,管道也会找到它。实际进程应该在脚本之前列出,但您依赖于此。如果它可能只是一个普通的shell脚本,那么将其作为perl脚本没有任何意义。@ChrisTurner:因为最初的问题是如何从perl中终止进程,选择使用shell脚本似乎与问题的前提相冲突。这个答案存在一些问题,但它是在Perl中完成的这一事实并不是其中之一。(例如:改用pgrep
;不要将用户输入直接导入backticks。)您知道Perl有内置函数吗?无需向外剥离。$processName
不会在q/
中插入。这意味着您正在搜索文本dollar
-p
-r
-o
--..
,最终将不返回任何内容。
use IPC::System::Simple qw(systemx EXIT_ANY);
systemx(EXIT_ANY, 'pkill', '-9', '--', $processName);
use IPC::System::Simple qw(capturex EXIT_ANY);
kill 9, capturex(EXIT_ANY, 'pgrep', '--', $processName));