【问题标题】:Cannot send signal to another process in perl无法在perl中向另一个进程发送信号
【发布时间】:2016-08-17 01:11:56
【问题描述】:

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

my $pid = `pidof xyz`;

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

当我按下运行此命令的按钮时,它会死掉。

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

【问题讨论】:

  • 其他进程是否使用相同的用户标识运行?只有 root 可以向不同用户的进程发送信号。
  • 尝试在错误消息中包含$!,这样您就会看到错误的原因。
  • @Barmar 如何检查 cgi perl 脚本的用户 ID。和其他过程。
  • 我假设您会知道您是否从同一个帐户运行这两个程序。但是您可以使用ps -l 来查看用户ID。

标签: linux perl cgi kill


【解决方案1】:

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

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 不匹配(如您帖子的 cmets 中所述)可能是原因。您可以使用 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

USER 列的值对于两个进程(Perl 进程和被杀死的进程)应该是相同的,否则你不能发送任何信号(除非你的脚本运行作为root,不推荐使用)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-01
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多