如何查杀stopped进程

本文介绍在Linux系统中如何使用ps命令查看Stopped状态的进程,并通过kill命令进行处理。Stopped状态通常由作业控制信号引起,使用特定的ps命令格式可以筛选出此类进程,再用kill命令结束。

Linux系统下面,top命令可以查看查看stopped进程。但是不能查看stopped进程的详细信息。那么如何查看stopped 进程,并且杀掉这些stopped进程呢?

ps -e j | grep T 

stopped进程的STAT状态为T,一般而言,进程有下面这些状态码:

D    uninterruptible sleep (usually IO)
I    Idle kernel thread
R    running or runnable (on run queue)
S    interruptible sleep (waiting for an event to complete)
T    stopped by job control signal
t    stopped by debugger during the tracing
W    paging (not valid since the 2.6.xx kernel)
X    dead (should never be seen)
Z    defunct ("zombie") process, terminated but not reaped by
     its parent

for BSD formats and when the stat keyword is used, additional
rs may be displayed:

<    high-priority (not nice to other users)
N    low-priority (nice to other users)
L    has pages locked into memory (for real-time and custom
     IO)
s    is a session leader
l    is multi-threaded (using CLONE_THREAD, like NPTL
     pthreads do)
+    is in the foreground process group

一般较常见的是5种状态码:

 	D 不可中断 uninterruptible sleep (usually IO)
        R 运行 runnable (on run queue)
 	S 中断 sleeping
 	T 停止 traced or stopped
 	Z 僵死 a defunct (”zombie”) process

所以,可以用下面命令ps -A -ostat,ppid,pid,cmd | grep -e ‘^[T]‘ 查看stopped的进程信息,进而使用kill命令将进程完全杀死。如下所示:

#  ps -A -ostat,ppid,pid,cmd | grep -e '^[T]'

T     6777  8635 more alert_pps.log
T     6777  9654 tail -60f alert_pps.log
T     6777 10724 top
# kill -9 8635
#  ps -A -ostat,ppid,pid,cmd | grep -e '^[T]'
T     6777  9654 tail -60f alert_pps.log
T     6777 10724 top
# kill -9 9654
# kill -9 10724

原文来自:https://www.linuxprobe.com/linux-stopped-process.html

# 题目重述 你反复尝试启动 ZooKeeper,确认配置无误、`myid` 正确、主机名和 IP 一致、端口未被占用,但 `./zkServer.sh status` 依然报错:“Error contacting service. It is probably not running”,而 `start` 显示 STARTED,`stop` 显示 STOPPED。你情绪激动地喊:“不对呀不对呀!”——说明你已穷尽常规手段,急需精准定位根源。 --- # 详解 我们不再假设任何低级错误(如拼写、冒号、路径),而是进入 **ZooKeeper 启动失败的终极真相层**: > 🔥 **问题不在配置,而在「Java 进程启动了,但 ZooKeeper Server 没有成功绑定 clientPort」** > 👉 即:JVM 起来了,ZooKeeper 的 `QuorumPeerMain` 类也运行了,但由于某种原因,**它没能成功监听 2181 端口**,所以 `status` 连不上。 --- ## 🧩 核心诊断逻辑链 | 现象 | 推论 | |------|------| | `start` 显示 STARTED | JVM 已启动,`zkServer.sh` 认为服务在跑 | | `status` 连不上 | 本地客户端无法连接 2181 端口 | | `stop` 显示 STOPPED | 脚本能找到 PID 并 kill → 说明进程存在过 | | ❌ 实际服务不可用 | **ZooKeeper 内部初始化失败,未完成网络绑定** | --- ## ✅ 必须立即查看的日志文件! > **所有答案都在这里:** ```bash tail -f /usr/local/apache-zookeeper-3.8.3-bin/logs/zookeeper-*.out ``` 或者更精确查找日志路径: ```bash find /usr/local/apache-zookeeper-3.8.3-bin -name "*.out" -o -name "*.log" ``` 打开后你会看到类似以下几种典型致命错误: --- ### ❌ 错误类型 1:`Address already in use`(经典伪装者) 你以为端口空闲,其实是: ```log java.net.BindException: Address already in use at sun.nio.ch.Net.bind0(Native Method) at sun.nio.ch.Net.bind(Net.java:461) at sun.nio.ch.NioSocketAcceptor.bind(NioSocketAcceptor.java:78) at org.apache.zookeeper.server.NIOServerCnxnFactory.configure(NIOServerCnxnFactory.java:65) ``` 💡 **为什么 `netstat` 看不到?** 因为有些残留进程显示,或使用 `SO_REUSEPORT` 导致短暂冲突。 🔧 解决: ```bash # 彻底杀死所有 Java 相关 zookeeper 进程 pkill -f QuorumPeerMain # 或按进程查杀 ps aux | grep zookeeper kill -9 <pid> ``` --- ### ❌ 错误类型 2:`Unable to access datadir` 权限问题 即使目录存在,也可能因权限不足无法写入: ```log org.apache.zookeeper.server.persistence.FileTxnSnapLog: Unable to create data directory /root/data/zookeeper/version-2 ``` 💡 原因:你曾经用 `sudo` 启动过,导致生成的文件属于 root,现在切换用户后无法访问。 🔧 解决: ```bash # 确保目录可写 chown -R youruser:youruser /root/data/zookeeper # 或改用当前用户拥有路径(推荐开发环境) mkdir -p ~/zookeeper/data echo "1" > ~/zookeeper/data/myid # 修改 zoo.cfg 中 dataDir=~/zookeeper/data ``` --- ### ❌ 错误类型 3:`MyId 1 not in the peer list` 集群列表不同步 日志中出现: ```log org.apache.zookeeper.server.quorum.QuorumPeerConfig: MyId 1 is not in the peer list ``` 💡 原因:`zoo.cfg` 中没有 `server.1=master:2888:3888`,或者写成了 `server.l`(视觉混淆),或用了中文字符导致解析失败。 ⚠️ 即使你看 `cat` 出来像对的,也可能实际是: - 字符编码乱码; - 文件末尾有隐藏换行; - 使用了 `\r\n` 回车导致解析截断。 🔧 解决: ```bash # 用 hexdump 检查是否含隐藏字符 hexdump -C /usr/local/apache-zookeeper-3.8.3-bin/conf/zoo.cfg | grep "server.1" # 或重写一行干净的 echo "server.1=master:2888:3888" >> /usr/local/apache-zookeeper-3.8.3-bin/conf/zoo.cfg ``` --- ### ❌ 错误类型 4:JVM 启动参数过大,内存溢出 你机器只有 1GB 内存,但默认 `zkServer.sh` 可能分配 1G 堆: ```log Error occurred during initialization of VM Could not reserve enough space for object heap ``` 🔧 解决:修改 `zkServer.sh`,降低 JVM 参数: ```bash JAVA_OPTS="$JAVA_OPTS -Xms128m -Xmx256m" ``` --- ## ✅ 最终极验证命令组合 ```bash # 1. 彻底清理 pkill -f zookeeper # 2. 确认无残留进程 ps aux | grep -i zoo # 3. 检查 myid cat /root/data/zookeeper/myid # 4. 查看日志(开新窗口实时监控) tail -f /usr/local/apache-zookeeper-3.8.3-bin/logs/zookeeper-*.out # 5. 启动 ./zkServer.sh start # 6. 查看状态 ./zkServer.sh status # 7. 检查端口是否真监听 ss -tuln | grep 2181 ``` 如果 `ss` 没输出 → 说明服务没绑定成功 → 回去看日志! --- # 知识点 - **日志是唯一真相来源**:`zookeeper.out` 记录了 JVM 启动全过程,必须查看才能定位根因。 - **进程存在≠服务可用**:JVM 可能因配置、权限、内存等问题启动失败而不退出进程。 - **隐藏字符破坏配置**:看似正确的 `server.1` 可能含不可见字符,导致 ZooKeeper 解析失败。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值