查看linux中程序是否被系统杀死,如何查看日志

文章讲述了在Linux环境中,当服务器内存不足时,内核如何通过OOMKiller机制选择并结束占用内存过多的进程。通过分析系统日志,特别是/var/log/messages,可以发现进程被杀的线索。OOMKiller依据oom_adj和oom_score选择要杀死的进程,这两个值可以被调整以保护重要进程不受影响。通过设置/proc/$pid/oom_score_adj,可以降低进程被杀死的风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在linux开发日常中,维护之前发布的程序,几台服务器只有一台在重启,而且不定期,查看服务日志也没有任何signal信号以及服务挂掉的原因打印,迫于无奈怀疑是linux系统给服务干掉了。于是想查看服务被杀掉的日志,看看系统日志,即可判断。

即途中目录下的messages文件,通过命令即可过滤信息查看是否被系统killed。

 用以下命令查看系统日志信息!

egrep -i 'killed process' /var/log/messages

命令输出如下:

 参数解析:

total-vm: total virtual memory. 进程使用的总的虚拟内存。
rss: resident set size. 驻留集大小。驻留集是指进程已装入内存的页面的集合。
anon-rss: anonymous rss. 匿名驻留集。比如malloc出来的就是匿名的。
file-rss: 映射到设备和文件上的内存页面。
shmem-rss: 大概是shared memory rss?

从上述输出可以看出被系统杀掉了!时间也能对上,9点52分被杀掉,至此已经排查出问题,就是服务器内存不够用所导致!!!准备修改这台服务器的服务权重,尽量少分配任务来减小这台服务器压力。

Linux 内核有个机制叫OOM killer(Out Of Memory killer),该机制会监控那些占用内存过大,尤其是瞬间占用内存很快的进程,然后防止内存耗尽而自动把该进程杀掉。内核检测到系统内存不足、挑选并杀掉某个进程的过程可以参考内核源代码linux/mm/oom_kill.c,当系统内存不足的时候,out_of_memory()被触发,然后调用select_bad_process()选择一个”bad”进程杀掉。如何判断和选择一个”bad进程呢?linux选择”bad”进程是通过调用oom_badness(),挑选的算法和想法都很简单很朴实:最bad的那个进程就是那个最占用内存的进程。

基本概念

Linux 内核有个机制叫OOM killer(Out-Of-Memory killer),该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽而内核会把该进程杀掉。

oom killer机制分析

oom killer是计算出选择哪个进程kill呢?我们先来看一下kernel提供给用户态的/proc下的一些参数: /proc/[pid]/oom_adj ,该pid进程被oom killer杀掉的权重,介于 [-17,15]之间,越高的权重,意味着更可能被oom killer选中,-17表示禁止被kill掉。 /proc/[pid]/oom_score,当前该pid进程的被kill的分数,越高的分数意味着越可能被kill,这个数值是根据oom_adj运算后的结果,是oom_killer的主要参考。

sysctl 下有2个可配置选项:

  • vm.panic_on_oom = 0 #内存不够时内核是否直接panic
  • vm.oom_kill_allocating_task = 1 #oom-killer是否选择当前正在申请内存的进程进行kil
  • 如果想修改被oom killer选中的概率,禁止或者给oom_adj最小或偏小的值,也可以通过sysctl调节oom killer行为

可以保护重要的进程不被OOM Killer干掉吗?还真是可以!

OOM Killer会检查 /proc/$pid/oom_score_adj文件来调整最终的分数 (oom_score)。所以我们可以通过在这个文件中给一个大的负数,以降低该进程被选中并终止的可能性。oom_score_adj可以在-1000到1000间变化。如果你给了-1000,进程即使使用了100%的内存也不会被OOM Killer干掉。可通过下面命令修改oom_score_adj(比如设为-200):

<think>嗯,用户问的是如何在Linux上彻底杀死程序。我之前已经回答过关于CDH添加角色的问题,现在用户可能在使用Linux服务器时遇到了程序无响应或需要强制终止的情况。首先,我需要确认用户对Linux命令的熟悉程度,可能他们之前已经尝试过一些基本的方法,比如用`kill`命令但没成功,所以需要更彻底的方法。 用户可能的需求是彻底终止进程,包括那些僵尸进程或者无法通过普通方式杀死的进程。常见的步骤应该是先用`ps`或`top`找到进程ID,然后用`kill`发送信号。如果普通信号如SIGTERM(15)无效,可能需要用SIGKILL(9),但要注意这不会让进程有机会清理资源。另外,用户可能不知道如何查找进程,或者可能进程有子进程需要一起终止,所以可能需要用到`pkill`或`killall`,或者找到整个进程树。 另外,用户可能遇到的情况是进程在后台运行,或者被挂起,需要检查作业控制(jobs命令)然后用kill %作业号。还有可能进程是由某个用户启动的,需要sudo权限才能杀死,这时候可能需要用sudo或者切换root用户。 还有可能用户提到的“彻底杀死”是指不仅要终止进程,还要确保释放所有资源,比如关闭打开的文件、网络端口等,但SIGKILL并不能保证这些,只能强制停止。这时候可能需要用户确认是否有其他依赖服务,或者需要重启相关服务来完全清理。 另外,用户可能对僵尸进程不太了解,僵尸进程已经终止,但父进程没有回收,这时候需要杀死父进程,或者重启父进程。此时可能需要查找父进程ID(PPID)来处理。 需要提醒用户谨慎使用SIGKILL,因为可能导致数据丢失或资源未释放。建议先尝试用SIGTERM,再考虑SIGKILL。同时,可以介绍一些工具如htop,更直观地管理进程。 总结回答步骤应该是:1. 查找进程ID;2. 用kill发送信号;3. 处理特殊情况如僵尸进程、进程组;4. 使用强制信号;5. 验证是否终止。同时给出常用命令和注意事项。</think>在Linux系统中彻底终止程序通常需要找到进程ID(PID)并使用`kill`命令发送终止信号。以下是详细步骤及常见方法: --- ### **1. 查找目标进程的PID** #### **(1) 使用`ps`命令** ```bash ps aux | grep <进程名或关键字> # 示例:查找Firefox进程 ps aux | grep firefox ``` - 输出中第二列为PID。 #### **(2) 使用`pgrep`直接获取PID** ```bash pgrep <进程名> # 示例:查找Firefox的PID pgrep firefox ``` #### **(3) 使用`top`或`htop`(交互式工具)** ```bash top # 按`Shift + C`按进程名排序,按`k`输入PID终止 htop # 可视化界面,选中进程后按`F9`发送信号 ``` --- ### **2. 终止进程** #### **(1) 普通终止(允许进程清理资源)** ```bash kill <PID> # 默认发送SIGTERM(15)信号 kill -15 <PID> # 同上,建议优先使用 ``` #### **(2) 强制终止(立即停止,不清理资源)** ```bash kill -9 <PID> # 发送SIGKILL(9)信号,无法被进程捕获或忽略 ``` #### **(3) 终止所有同名进程** ```bash pkill <进程名> # 根据进程名发送信号(默认SIGTERM) pkill -9 <进程名> # 强制终止同名进程 killall <进程名> # 类似pkill,但需确认命令是否存在(部分系统需安装) ``` --- ### **3. 特殊场景处理** #### **(1) 终止进程及其子进程** 若进程存在子进程,需一并终止: ```bash # 方法1:终止整个进程组 kill -- -<进程组ID> # 进程组ID可通过`ps -o pgid= <PID>`获取 # 方法2:使用pkill终止树 pkill -TERM -P <父进程PID> # 终止指定父进程的所有子进程 ``` #### **(2) 处理僵尸进程(Zombie)** 僵尸进程(状态为`Z`)已终止但未被父进程回收,通常无需处理。若需清理: 1. 终止其父进程: ```bash kill -9 <父进程PID> ``` 2. 重启父进程服务(如Apache/Nginx)。 --- ### **4. 验证进程是否终止** ```bash ps -p <PID> # 若无输出,则进程已终止 pgrep <进程名> # 检查是否仍有残留PID ``` --- ### **5. 其他工具** #### **(1) `htop`(增强版top)** ```bash sudo apt install htop # Debian/Ubuntu htop # 按F9选择信号,强制终止进程 ``` #### **(2) `systemctl`(系统服务管理)** 若进程为系统服务: ```bash systemctl stop <服务名> # 停止服务 systemctl kill <服务名> # 强制终止服务 ``` --- ### **注意事项** 1. **谨慎使用`kill -9`**: - SIGKILL(9)会**立即终止进程**,可能导致数据丢失或资源未释放。 - 优先尝试SIGTERM(15),若无效再使用SIGKILL。 2. **权限问题**: - 普通用户只能终止自己的进程,root用户可终止所有进程。 - 若权限不足,使用`sudo kill <PID>`。 3. **守护进程(Daemon)**: - 部分服务(如Nginx)需通过服务管理命令(如`systemctl`)终止。 --- 通过上述方法,可彻底终止Linux系统中的异常进程。若问题仍存在,建议检查日志(`/var/log/`)或排查程序配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

美丽的欣情

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值