我想禁用一个在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 &
该作业仍在运行,且未生成核心转储。当我在命令行上一个接一个地运行这些命令时,它成功地终止了作业并创建了一个核心转储。
我的剧本有什么问题?
1条答案
按热度按时间ct3nt3jp1#
Bash Reference Manual声明:
当作业控制无效时,异步命令将忽略SIGINT和SIGQUIT...
默认情况下,交互式壳的作业控制处于启用状态,而非交互式壳的作业控制处于禁用状态。这就解释了后台/异步进程在处理SIGQUIT信号时所看到的差异。
解决此问题的一个方法是在程序中显式打开作业控制。将
set -o monitor
(或等效的set -m
)放在代码的开头。另一种选择是使用不同的信号来触发核心转储。例如,尝试
kill -ABRT %1
。