为什么 [kill -s SIGUSR1] 在脚本内不起作用,但在命令行上起作用? (回复:无效的信号规范)

为什么 [kill -s SIGUSR1] 在脚本内不起作用,但在命令行上起作用? (回复:无效的信号规范)

我正在尝试编写一个 shell 脚本 (/bin/sh),其中包含一个用于将 SIGUSR1 发送到进程的命令行选项:

my_command() {
        printf "Sending SIGUSR1: "
        kill -s SIGUSR1 `pidof my_process`
        [ $? = 0 ] && echo "OK" || echo "FAIL"
}

但是,它失败了:

/etc/init.d# ./S40test my_command
Sending SIGUSR1: ./S40test: line 39: kill: SIGUSR1: invalid signal specification
FAIL

但是,如果我在命令行上运行命令:

kill -s SIGUSR1 `pidof my_process`

...然后就可以正常工作了。

我还更改了 pidof my_process 以使用实际的进程号,但它仍然不起作用。

答案1

使用kill -s USR1 <pid>kill -USR1 <pid>代替。

根据 POSIX规格,前者是标准形式:

-s signal_name
使用标头中定义的符号名称之一指定要发送的信号<signal.h>。 signal_name 的值应以与大小写无关的方式进行识别,没有SIG前缀
...
-signal_name
[XSI] 相当于-s signal_name.

但后者几乎是普遍支持的(即使在非 posix shell 中,如csh)。

只有一些 shell 支持非标准kill -s SIGFOO形式,而不是kill -s FOO它们的kill内置函数;特别是dash(在 Debian 和 Ubuntu 上用于/bin/sh执行脚本),不支持它。

相关内容