Linux sh kill 无法执行 INVALID SIGNAL SPECIFICATION 执行失败

本文探讨了在bash和sh两种Shell环境下使用kill命令结束进程的不同表现,揭示了bash相较于sh在信号处理上的兼容性和修复问题。通过具体示例,文章详细解释了为何在sh中使用SIGTERM会遇到无效信号错误,并提供了正确的替代写法。

今天在解决问题的时候发现一个知识点:

在脚本中有一段用于结束进程的代码,通常我们都会使用 kill pid 或者 kill -9 pid,但是却提示 :

-SIGTERM INVALID SIGNAL SPECIFICATION(SIGTERM 是一个无效的信号指令)

通过慢慢分析得知:

bash

在这里插入代码片
#!/bin/bash

kill  -SIGTERM  PID

sh

#!/bin/sh

kill  -SIGTERM  PID 

# 提示:(SIGTERM INVALID  SIGNAL SPECIFICATION

我们可以看出 bash命令能够运行 -SIGTERM,而sh命令确无法执行;

后来翻阅资料看到有相同的问题记录:https://stackoverflow.com/questions/16423732/linux-shell-kill-signal-sigkill-kill

综上所述:

bash兼容性的要比sh要好,他修复了使用/bin/sh的问题,因为sh无法识别SIGTERM等内置命令或其他特性。

*当然如果你想在sh中使用如下命令

kill -TERM pid
kill -9 pid
kill pid

具体kill指令有那些, 可以自己在 KILL -L 查看信号说明

在这里插入图片描述

### Bash `kill` 命令中的 `invalid signal specification` 错误 在使用 `kill` 命令时,如果出现 `invalid signal specification` 错误,通常是因为传递给 `kill` 的信号参数格式不正确或信号编号不存在。`kill` 命令用于向进程发送指定的信号,常见的信号包括 `SIGTERM`(15)和 `SIGKILL`(9),分别用于优雅终止和强制终止进程。 当用户尝试使用 `kill -<signal>` 语法时,若输入的信号名拼写错误或信号编号超出系统支持范围,就会导致该错误。例如: ```bash kill -SIGTREM 1234 ``` 上述命令中 `SIGTREM` 是错误的拼写,正确的信号名应为 `SIGTERM`,因此系统会报错 `invalid signal specification` [^1]。 此外,如果使用了不支持的信号编号,例如 `kill -100 1234`,由于系统未定义该信号,同样会提示此错误。 为了避免此类问题,应确保使用有效的信号名称或编号。可以通过以下命令查看所有支持的信号列表: ```bash kill -l ``` 此命令将列出所有可用信号及其对应的编号,例如: ``` 1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT ... ``` 如果需要向进程发送 `SIGKILL` 信号以强制终止进程,可以使用以下命令: ```bash kill -9 1234 ``` 或者使用信号名称: ```bash kill -SIGKILL 1234 ``` 在某些情况下,可能希望使用 `pkill` 或 `killall` 命令以更灵活的方式终止进程。例如,`pkill` 支持通过部分进程名匹配终止进程: ```bash pkill firef ``` 此命令会终止所有以 `firef` 开头的进程,例如 `firefox` [^2]。 ### 示例:正确使用 `kill` 命令 以下是一个终止进程的示例,假设进程 ID 为 `1234`,希望发送 `SIGTERM` 信号: ```bash kill -15 1234 ``` 或者使用信号名称: ```bash kill -SIGTERM 1234 ``` 如果进程未响应 `SIGTERM`,可以使用 `SIGKILL` 强制终止: ```bash kill -9 1234 ``` 确保信号编号或名称正确,以避免 `invalid signal specification` 错误。 ### 总结 `kill` 命令出现 `invalid signal specification` 错误的主要原因是信号参数格式错误或信号编号无效。应使用 `kill -l` 查看支持的信号列表,并确保使用正确的信号名称或编号。此外,可以考虑使用 `pkill` 或 `killall` 以更灵活的方式终止进程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值