Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从perl脚本中终止进程_Perl_System_Pid_Kill - Fatal编程技术网

从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));