我正在尝试编写一个 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
执行脚本),不支持它。