core文件处理和进程查询

一,core的信号

core的信号处理方式:终止进程+产生core文件

设置生成core:ulimit -c unlimited
取消生成core:ulimit-c 0


这里写图片描述

gdb调试使用bag

设置core文件格式:/proc/sys/kernel/core_pattern 
文件不能vi,可以用后面的套路 ,使用root权限 echo "core-%e-%p-%t" > /proc/sys/kernel/core_pattern
以下是参数列表 :
    %p - insert pid into filename 添加 pid
    %u - insert current uid into filename 添加当前 uid
    %g - insert current gid into filename 添加当前 gid
    %s - insert signal that caused the coredump into the filename 添加导致产生 core 的信号
    %t - insert UNIX time that the coredump occurred into filename 添加 core 文件生成时的 unix 时间
    %h - insert hostname where the coredump happened into filename 添加主机名
    %e - insert coredumping executable name into filename 添加命令名

二, 查看 进程的文件描述符

  • 设置文件描述符命令

ulimit -n 999999

  • 查看每一个进程的信息

ls -la /proc/32189/fd

这里写图片描述

三, ps -aux命令详解

Linux ps aux指令詳解

1, linux上进程有5种状态:
  1. 运行(正在运行或在运行队列中等待)
  2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
  3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
  4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
  5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)
2, ps 参数
  1. ps a 显示现行终端机下的所有程序,包括其他用户的程序。
  2. ps -A 显示所有程序。
  3. ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。
  4. ps -e 此参数的效果和指定"A"参数相同。
  5. ps e 列出程序时,显示每个程序所使用的环境变量。
  6. ps f 用ASCII字符显示树状结构,表达程序间的相互关系。
  7. ps -H 显示树状结构,表示程序间的相互关系。
  8. ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。
  9. ps s 采用程序信号的格式显示程序状况。
  10. ps S 列出程序时,包括已中断的子程序资料。
  11. ps -t <终端机编号>  指定终端机编号,并列出属于该终端机的程序的状况。
  12. ps u   以用户为主的格式来显示程序状况。
  13. ps x   显示所有程序,不以终端机来区分。
  14. ps -l 較長,較詳細的顯示該PID的信息
# ps -lA |more
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 76 0 - 1193 109952 ? 00:00:03 init
1 S 0 2 1 0 -40 - - 0 migrat ? 00:00:03 migration/0
1 S 0 3 1 0 94 19 - 0 ksofti ? 00:00:00 ksoftirqd/0
1 S 0 4 1 0 -40 - - 0 migrat ? 00:00:02 migration/1
1 S 0 5 1 0 94 19 - 0 ksofti ? 00:00:00 ksoftirqd/1
1 S 0 6 1 0 -40 - - 0 migrat ? 00:00:02 migration/2
1 S 0 7 1 0 94 19 - 0 ksofti ? 00:00:00 ksoftirqd/2
相關信息的意義:
F 進程的標誌(flag),4表示用戶為超級用戶
S 進程的狀態(stat),各STAT的意義見下文
PID 進程的ID
C CPU使用資源的百分比
PRI priority(優先級)的縮寫,
NI Nice值,
ADDR 核心功能,指出該進程在內存的那一部分,如果是運行的進程,一般都是“-”
SZ 用掉的內存的大小
WCHAN 當前進程是否正在運行,若為“-”表示正在運行
TTY 登陸者的終端位置
TIME 用掉的CPU的時間
CMD 所執行的指令
# ps aux |more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.0 4772 564 ? S Sep22 0:03 init [3]
root 2 0.0 0.0 0 0 ? S Sep22 0:03 [migration/0]
root 3 0.0 0.0 0 0 ? SN Sep22 0:00 [ksoftirqd/0]
root 4 0.0 0.0 0 0 ? S Sep22 0:02 [migration/1]
root 5 0.0 0.0 0 0 ? SN Sep22 0:00 [ksoftirqd/1]
root 6 0.0 0.0 0 0 ? Ss+ Sep22 0:02 [migration/2]
root 7 0.0 0.0 0 0 ? SN Sep22 0:00 [ksoftirqd/2]
root 8 0.0 0.0 0 0 ? S Sep22 0:00 [migration/3]
root 9 0.0 0.0 0 0 ? SN Sep22 0:00 [ksoftirqd/3]
root 10 0.0 0.0 0 0 ? S< Sep22 0:00 [migration/4]

上述各位解释:

参数说明
USER进程的属主;
PID进程的ID;
PPID父进程;
%CPU进程占用的CPU百分比;
%MEM占用内存的百分比;
NI进程的NICE值,数值大,表示较少占用CPU时间;
VSZ进程使用的虚拟內存量(KB);
RSS该进程占用的固定內存量(KB)(驻留中页的数量);
TTY该进程在那個終端上運行(登陸者的終端位置),若與終端無關,則顯示(?)。若为pts/0等,则表示由网络连接主机进程
WCHAN当前进程是否正在進行,若为-表示正在進行;
START該進程被觸發启动时间;
TIME該进程實際使用CPU運行的时间;
COMMAND命令的名称和参数;
STAT狀態位常見的狀態字符

STAT狀態字符:

D 无法中断的休眠状态(通常 IO 的进程);
R 正在运行可中在队列中可过行的;
S 处于休眠状态;
T 停止或被追踪;
W 进入内存交换 (从内核2.6开始无效);
X 死掉的进程 (基本很少見);
Z 僵尸进程;
< 优先级高的进程
N 优先级较低的进程
L 有些页被锁进内存;
s 进程的领导者(在它之下有子进程);
l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads);
+ 位于后台的进程组;

个人博客地址:https://chensongpoixs.github.io/

<think>好的,用户问为什么有些进程能生成core文件而有些不能。首先,我得回顾之前教他们用sleepkill测试core文件生成的方法。现在他们要更深入理解背后的原因。我需要整理几个关键点,比如系统配置、进程设置、信号类型、权限问题等。 用户可能遇到的情况是,按照步骤操作后发现有些进程确实没生成core文件,但不确定原因。他们可能需要排查问题,所以需要详细解释每个可能的影响因素。 首先,系统级的配置是基础,比如ulimit设置是否正确,core文件大小是否限制,以及kernel.core_pattern的路径权限。如果ulimit -c没设置成unlimited,或者存储路径不可写,core文件就不会生成。 然后要考虑进程本身的情况。比如进程是否有写入权限,是否在可写目录下运行。还有进程是否调用了修改core dump行为的函数,比如setrlimit或者prctl,这些可能禁用了core dump。另外,SUID/SGID程序出于安全考虑可能默认不生成core文件。 信号类型也很重要,只有特定的信号如SIGABRT、SIGSEGV等会触发core dump,而SIGKILL或SIGTERM不会。用户可能在发送信号时用了错误的类型。 还有文件系统问题,比如磁盘空间不足,或者文件系统挂载时加了noexec或nodev选项,也可能导致无法生成。容器或虚拟化环境中的权限限制也是一个因素。 针对不同系统,比如Ubuntu的apport服务可能会拦截core文件,需要禁用才能生成。此外,检查/proc/sys/kernel/core_uses_pid是否添加了PID到文件名,避免覆盖。 用户可能需要具体的例子来理解,比如SUID程序的问题,或者如何检查进程的资源限制。此外,排查步骤应该详细,包括检查配置、权限、信号类型等。 最后,总结常见原因,并给出解决方法,比如正确配置ulimit,检查路径权限,使用有效信号,处理特殊程序等。这样用户就能系统地排查问题,理解为什么有些进程无法生成core文件。</think>--- 进程是否生成core文件取决于**系统配置、进程运行环境及自身特性**。以下是关键影响因素及详细分析: --- ### **一、系统级配置差异** 1. **核心转储开关未开启** - 通过 `ulimit -c` 控制当前会话的core文件大小限制: ```bash ulimit -c unlimited # 允许生成 ulimit -c 0 # 禁止生成(默认值) ``` - 若未设置为 `unlimited`,则**所有进程均无法生成core文件**。 2. **存储路径配置错误** - 通过 `kernel.core_pattern` 定义core文件存储规则: ```bash sysctl kernel.core_pattern # 查看路径模板 # 示例输出:/tmp/core-%e-%p ``` - 若路径不存在、无写入权限或磁盘空间不足,**所有进程均无法生成core**。 --- ### **二、进程自身特性限制** | **场景** | **原因分析** | |-------------------------|----------------------------------------------------------------------------| | **SUID/SGID程序** | 出于安全考虑,默认禁止生成core文件(需在`kernel.core_pattern`中配置`%E`参数) | | **进程资源限制** | 通过 `setrlimit(RLIMIT_CORE, ...)` 主动限制自身core文件大小 | | **执行路径不可写** | 进程运行时目录无写入权限(如运行在`/usr/bin/`等系统目录) | | **信号类型不匹配** | 仅特定信号(如 `SIGABRT`/`SIGSEGV`)触发core dump,`SIGKILL`/`SIGTERM`无效 | | **容器化环境** | 容器内默认限制core文件生成(需调整容器配置如 `--ulimit core=-1`) | --- ### **三、关键排查步骤** #### **步骤1:验证系统级配置** ```bash # 检查全局core文件开关 ulimit -c # 必须返回 "unlimited" sysctl kernel.core_pattern # 确认路径有效且可写 # 示例:若路径为 /tmp/core,需确保: mkdir -p /tmp/core && chmod 777 /tmp/core ``` #### **步骤2:检查进程自身限制** ```bash # 查看目标进程的资源限制 cat /proc/<PID>/limits | grep "core file size" # 输出示例: # Max core file size unlimited unlimited # 检查进程是否主动禁用core grep -a "core_dump_filter" /proc/<PID>/status # 若值为0x00000000,则禁止生成 ``` #### **步骤3:触发条件验证** ```bash # 发送有效信号(测试用) kill -ABRT <PID> # 使用SIGABRT(6) kill -SEGV <PID> # 使用SIGSEGV(11) # 避免使用无效信号: kill -KILL <PID> # SIGKILL(9) 不会生成core kill -TERM <PID> # SIGTERM(15) 不会生成core ``` --- ### **四、典型案例分析** #### **案例1:SUID程序无法生成core** - **现象**:运行 `/usr/bin/passwd`(SUID程序)崩溃后无core文件 - **解决方案**: ```bash # 修改kernel.core_pattern,添加SUID信息 echo "|/usr/lib/systemd/systemd-coredump %E %p" | sudo tee /proc/sys/kernel/core_pattern ``` #### **案例2:容器内进程core文件** - **现象**:Docker容器内进程崩溃后无core - **解决方案**: ```bash # 启动容器时解除限制 docker run --ulimit core=-1 <image> ``` #### **案例3:进程主动禁用core** - **C代码示例**: ```c #include <sys/resource.h> int main() { struct rlimit rlim = {0, 0}; setrlimit(RLIMIT_CORE, &rlim); // 禁用core文件 *(int*)0 = 0; // 触发段错误 return 0; } ``` - **结果**:即使系统配置允许,该进程也不会生成core。 --- ### **五、总结:核心条件表** | **条件** | **允许生成core** | **禁止生成core** | |-------------------------|------------------|------------------| | `ulimit -c unlimited` | ✅ | ❌ | | 有效信号(SIGABRT等) | ✅ | ❌ | | 存储路径可写 | ✅ | ❌ | | SUID/SGID程序 | ❌(需配置) | ✅(默认) | | 进程主动设置RLIMIT_CORE=0 | ❌ | ✅ | --- 通过上述分析,可针对性检查系统配置、进程特性及运行环境,定位无法生成core文件的具体原因。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值