如何从bash脚本向目标进程发送携带int类型数据的信号
Bash脚本发送携带整型负载信号的实现方案
Linux系统仅支持实时信号(SIGRTMIN ~ SIGRTMAX范围)通过sigqueue系统调用携带附加整型数据,Bash本身没有内置对应能力,可通过默认预装的脚本语言调用系统调用实现,无需编译C程序,也无需使用管道:
方案1:Perl实现(兼容性最优,绝大多数发行版默认预装Perl)
直接调用POSIX标准的sigqueue接口,和C程序的实现逻辑完全一致:
#!/bin/bash # 配置参数 TARGET_PID=你的目标进程PID # 示例使用SIGRTMIN+2作为发送信号,可自行调整 SIGNAL=$(perl -e 'use POSIX; print SIGRTMIN+2') # 要携带的int类型数据 PAYLOAD_INT=1024 # 执行信号发送 perl -e ' use POSIX qw(sigqueue); sigqueue($ARGV[0], int($ARGV[1]), int($ARGV[2])) or die "发送失败: $!" ' $TARGET_PID $SIGNAL $PAYLOAD_INT
方案2:Python实现(适合预装Python3.3+的环境)
使用os.kill的扩展参数实现信号发送:
#!/bin/bash # 配置参数 TARGET_PID=你的目标进程PID SIGNAL=$(python3 -c 'import signal; print(signal.SIGRTMIN+2)') PAYLOAD_INT=1024 # 执行信号发送 python3 -c " import os, signal os.kill($TARGET_PID, $SIGNAL, $PAYLOAD_INT) "
注意事项
- 只有实时信号支持携带自定义负载,常规标准信号(如
SIGUSR1、SIGTERM)的附加负载会被内核忽略,无法被接收方获取。 - 目标进程必须注册带
SA_SIGINFO标志的信号处理函数,才能正确读取到你发送的整型数据,和你现有C语言的接收逻辑完全兼容。
内容的提问来源于stack exchange,提问作者Ventus
相关产品推荐
相关产品推荐

