如何发送信号linux

Linux发送信号使用kill命令,如kill -15 PID发送SIGTER

在Linux系统中,发送信号是进程管理的核心操作之一,常用于控制程序行为、传递事件通知或进行故障排查,以下是详细的实现方法和场景分析:

如何发送信号linux

信号基础概念

Linux信号本质上是一种软中断机制,用于向进程传递异步事件,系统预定义了多种标准信号,每个信号对应特定的行为(如终止、暂停、自定义处理等)。

常见信号类型及作用
| 信号名 | 信号值 | 默认行为 | 典型用途 |
|————–|——–|———————–|————————|
| SIGTERM | 15 | 终止进程(可捕获) | 优雅关闭程序 |
| SIGKILL | 9 | 强制终止进程 | 立即停止失控进程 |
| SIGSTOP | 17 | 暂停进程 | 调试或临时中止任务 |
| SIGCONT | 18 | 恢复暂停进程 | 配合SIGSTOP使用 |
| SIGUSR1/2 | 10/12 | 默认终止(可自定义) | 用户自定义信号处理逻辑 |
| SIGSEGV | 11 | 核心转储(记录崩溃) | 调试内存访问错误 |

发送信号的常用命令

kill命令

这是最基础的信号发送工具,支持通过PID指定目标进程。

# 基础语法
kill [选项] PID
# 发送SIGTERM信号(默认)
kill 1234
# 发送指定信号(如SIGUSR1)
kill -s SIGUSR1 1234
# 发送SIGKILL信号强制终止
kill -9 1234

关键选项

  • -s:指定信号名称或编号
  • -l:列出所有信号名称及对应的数值
  • -v:显示信号实际发送过程(调试用)

killall命令

按进程名批量发送信号,适用于需要同时操作多个同名进程的场景。

# 发送SIGTERM到所有httpd进程
killall httpd
# 发送SIGKILL到所有php-fpm进程
killall -9 php-fpm

注意:会匹配所有同名进程,谨慎使用防误杀。

pkill命令

通过进程名筛选发送信号,支持正则表达式。

如何发送信号linux

# 终止所有以"test"开头的进程
pkill -f ^test.
# 发送SIGUSR2到包含特定字符串的进程
pkill -s SIGUSR2 'python.script'

参数说明

  • -f:按完整命令行匹配
  • -u:按用户过滤进程
  • -t:按终端号过滤

信号处理工具与场景

压力测试工具stress-ng

验证信号处理能力:

# 启动持续生成CPU负载的进程
stress-ng --cpu 4
# 在另一个终端发送SIGHUP信号重新加载配置
kill -HUP 1234

trap命令捕获信号

在Shell脚本中自定义信号响应:

#!/bin/bash
trap "echo 'Caught SIGINT'; exit" SIGINT
while true; do
  sleep 1 && echo "Running..."
done

运行效果:当按下Ctrl+C时,触发自定义的回声消息而非直接终止。

pstack查看信号处理栈

分析进程接收信号时的调用状态:

# 发送SIGSTOP暂停目标进程
kill -17 1234
# 查看进程栈信息
pstack 1234

输出示例

Thread 1 (tid=1234):
#0  0x00007fbd4c0d0000 in __sleep_enointerrupt()
#1  0x0000000000401234 in main ()

编程方式发送信号

C语言实现

#include <signal.h>
#include <stdio.h>
int main() {
    pid_t pid = 1234; // 目标进程PID
    if (kill(pid, SIGUSR1) == -1) {
        perror("Signal send failed");
    } else {
        printf("Signal SIGUSR1 sent to %dn", pid);
    }
    return 0;
}

Python脚本发送信号

import os
import signal
def send_signal(pid, sig):
    try:
        os.kill(pid, sig)
        print(f"Signal {sig} sent to {pid}")
    except ProcessLookupError:
        print(f"No such process {pid}")
# 发送SIGTERM到指定PID
send_signal(1234, signal.SIGTERM)

Shell脚本集成信号处理

#!/bin/bash
# 监听SIGUSR1并执行清理操作
trap 'echo "Cleaning up..."; rm -f /tmp/test.lock' SIGUSR1
# 模拟长时间任务
while true; do
  sleep 60 &
  wait
done

高级应用场景

进程监控系统

通过定时发送信号实现健康检查:

如何发送信号linux

# 每分钟发送SIGQUERY检查进程状态
while true; do
  kill -0 $PID || echo "Process $PID not running"
  sleep 60
done

自定义信号处理逻辑

在应用程序中重写信号处理函数:

#include <signal.h>
#include <stdio.h>
void handle_sigterm(int sig) {
    printf("Received SIGTERM, shutting down...n");
    // 执行资源释放操作
    exit(0);
}
int main() {
    signal(SIGTERM, handle_sigterm);
    while (1) pause(); // 等待信号
}

跨进程同步信号

使用SIGUSR系列信号实现自定义事件通知:

# 进程A发送信号
kill -s SIGUSR2 5678
# 进程B接收处理
trap 'echo "Received custom event"; exit' SIGUSR2

常见问题与解决方案

FAQs

Q1:如何快速查找进程的PID?
A1:使用pidof命令或pgrep工具:

# 通过进程名获取PID
pidof nginx
# 使用正则表达式匹配进程
pgrep '^sshd$'

Q2:发送信号后进程无响应怎么办?
A2:可能原因及解决方法:

  1. 信号被忽略:部分进程会主动忽略特定信号(如SIGTERM),可尝试SIGKILL强制终止
  2. 权限不足:需使用sudo提升权限
  3. 进程已退出:先用ps确认进程是否存在
  4. 信号未正确发送:检查PID准确性,避免

原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/68994.html

(0)
酷盾叔的头像酷盾叔
上一篇 2025年7月19日 11:58
下一篇 2025年7月19日 12:02

相关推荐

  • Linux SSH端口怎么查看

    要查看Linux SSH端口,编辑/etc/ssh/sshd_config文件搜索’Port’行,或运行sudo netstat -tuln | grep ssh命令检查监听端口,默认端口通常为22。

    2025年6月18日
    300
  • 如何给linux内核打补丁

    Linux内核打补丁,需先下载对应内核版本的补丁文件,进入内核源码目录,用patch -p1 ˂ 补丁文件路径命令应用补丁,之后重新编译和安装内核

    2025年7月11日
    000
  • linux如何切换桌面

    Linux中,常用快捷键切换桌面,如Ctrl+Alt+方向键可切换不同桌面

    2025年7月14日
    000
  • Linux服务器连接数怎么查

    查看Linux连接数常用命令: ,1. 使用 netstat -ant | wc -l 统计TCP连接总数。 ,2. 通过 ss -s 查看汇总信息(更高效)。 ,3. 指定状态如 netstat -ant | grep ESTABLISHED | wc -l 统计已建立连接。 ,4. netstat -tun 或 ss -tun 可显示详细连接信息。

    2025年6月8日
    100
  • 如何在Linux中修改MAC地址?

    临时修改Linux MAC地址:先停用网卡(sudo ip link set dev eth0 down),再用sudo ip link set dev eth0 address XX:XX:XX:XX:XX:XX设置新地址,最后启用网卡(sudo ip link set dev eth0 up),重启失效,永久修改需改配置文件或用macchanger工具。

    2025年6月3日
    700

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN