![为什么 [kill -s SIGUSR1] 在脚本内不起作用,但在命令行上起作用? (回复:无效的信号规范)](https://linux22.com/image/186804/%E4%B8%BA%E4%BB%80%E4%B9%88%20%5Bkill%20-s%20SIGUSR1%5D%20%E5%9C%A8%E8%84%9A%E6%9C%AC%E5%86%85%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%8C%E4%BD%86%E5%9C%A8%E5%91%BD%E4%BB%A4%E8%A1%8C%E4%B8%8A%E8%B5%B7%E4%BD%9C%E7%94%A8%EF%BC%9F%20%EF%BC%88%E5%9B%9E%E5%A4%8D%EF%BC%9A%E6%97%A0%E6%95%88%E7%9A%84%E4%BF%A1%E5%8F%B7%E8%A7%84%E8%8C%83%EF%BC%89.png)
我正在尝试编写一个 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
执行脚本),不支持它。