linux 如何从bash脚本创建一个核心转储?

5us2dqdw  于 2023-06-02  发布在  Linux
关注(0)|答案(1)|浏览(151)

我想禁用一个在docker容器内运行的进程的核心转储。该进程是从一个bash脚本启动的,该脚本是容器的入口点。我的计划是将ulimit -c 0命令添加到bash脚本中,以禁用进程的核心转储。
为了测试和查看这是否有效,我创建了下面的bash脚本,它应该创建一个睡眠作业,然后杀死它以创建一个核心转储。这个想法是,在我知道这会创建一个核心转储后,我会将ulimit -c 0添加到脚本中,看看它是否会阻止转储。我的问题是这个过程没有被杀死。

#!/bin/bash

ulimit -c

sleep 1000&

jobs

kill -3 %1

jobs

我得到的输出如下

sh-4.2# bash test.sh 
unlimited
[1]+  Running                 sleep 1000 &
[1]+  Running                 sleep 1000 &

该作业仍在运行,且未生成核心转储。当我在命令行上一个接一个地运行这些命令时,它成功地终止了作业并创建了一个核心转储。
我的剧本有什么问题?

ct3nt3jp

ct3nt3jp1#

Bash Reference Manual声明:
当作业控制无效时,异步命令将忽略SIGINT和SIGQUIT...
默认情况下,交互式壳的作业控制处于启用状态,而非交互式壳的作业控制处于禁用状态。这就解释了后台/异步进程在处理SIGQUIT信号时所看到的差异。
解决此问题的一个方法是在程序中显式打开作业控制。将set -o monitor(或等效的set -m)放在代码的开头。
另一种选择是使用不同的信号来触发核心转储。例如,尝试kill -ABRT %1

相关问题