linux - 无法将信号发送到perl中的另一个进程

标签 linux perl cgi kill

我必须在 cgi perl 脚本中将 sigusr2 信号编号 12 发送到名为 xyz 的进程。我执行以下操作:

my $pid = `pidof xyz`;

kill 12, $pid or die "could not kill: $pid";

当我按下运行此命令的按钮时它就死了。

如何在 cgi perl 脚本中向名为“xyz”的进程发送信号。

最佳答案

你应该用 $! 扩展你的错误信息:

my $pid = `pidof xyz`;
kill 12, $pid or die "could not kill $pid: $!";

$!包含最后一个系统调用错误:http://perldoc.perl.org/perlvar.html#%24ERRNO

您还应该检查是否已找到任何 PID:

my $pid = `pidof xyz`;
die 'No PID found for xyz!' unless $pid;
kill 12, $pid or die "could not kill $pid: $!";

uid 不匹配(如您帖子的评论中所述)可能是原因。您可以使用 ps 检查:

my $pid = `pidof xyz`;
die 'No PID found for xyz!' unless $pid;
system "ps u $$ $pid";
kill 12, $pid or die "could not kill $pid: $!";

输出应该是这样的:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0 185388  5960 ?        Ss   08:31   0:01 /sbin/init splash
some      3159  0.0  0.0  27296  8836 pts/11   Ss   08:33   0:00 bash

对于两个进程(Perl 进程和被杀死的进程),USER 列的值应该相同,否则不允许发送任何信号(除非您的脚本运行作为 root,不推荐这样做)。

关于linux - 无法将信号发送到perl中的另一个进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36810178/

相关文章:

linux - 网络设备的 ACL

linux - 如何在这里实现设置 ssh 隧道到端口...?

python - ModuleNotFoundError:没有名为 'schedule' 的模块

java - 如何在 Linux 中进行延迟/延迟加载?

linux - 捕获第三列到最后一列

windows - 仅当我在 Windows 上运行 Perl 脚本时,如何才能包含 Win32 模块?

perl - 有没有办法比较模板工具包中的两个变量?

linux - TCP_MAXSEG 不准确? (是 : Linux path MTU probing not working on accept():ed socket if requested using setsockopt())

perl - 如何使用 Perl 将字符串分成两部分?

未找到 Python cgi 服务器模块