![使用正确的链加载命令。](https://linux22.com/image/9595/%E4%BD%BF%E7%94%A8%E6%AD%A3%E7%A1%AE%E7%9A%84%E9%93%BE%E5%8A%A0%E8%BD%BD%E5%91%BD%E4%BB%A4%E3%80%82.png)
我们的实验室中有以下脚本(在 CentoS 6 中)来一一执行我们的应用程序及其输出。
cd A/
sleep 1
gnome-terminal -t A --tab -e "./app1"
cd ../B/
sleep 1
gnome-terminal -t b --tab -e "./app2"
sleep 2
gnome-terminal -t c --tab -e "./app3"
这工作完美。
ulimit -c
现在我们想要的是为我们的应用程序之一(即app3)默认显示生成核心转储文件
0
,并且我不想更改其默认值。
gnome-terminal -t c --tab -e "ulimit -c unlimited ; ./c"
不起作用,当用谷歌搜索发现应该运行脚本时,sh -c "ulimit -c unlimited"
.
gnome-terminal -t c --tab -e "sh -c "ulimit -c unlimited"
工作完美。
但是,
gnome-terminal -t c --tab -e "sh -c "ulimit -c unlimited ; ./app3"
不起作用。
如何只为 app3 启用核心转储?注意:我们不希望在全球范围内出现这种情况。
答案1
有三种方法可以做到这一点。
使用正确的链加载命令。
不要使用 shell 内置命令ulimit
,而是使用为此目的开发的命令,例如各种 daemontools 系列工具集:
softlimit
来自守护进程工具softlimit
来自弗里特softlimit
来自 daemontools-encoresoftlimit
从小吃s6-softlimit
从s6开始chpst
来自鲁尼特runlimit
来自罪犯
因此,可以使用softlimit
nosh 工具集作为示例来运行:
gnome-terminal -t A --tab -e "softlimit --coresize unlimited ./app1"
在脚本中使用子 shell。
这也适用于终端仿真器进程的限制。在这种情况下,这将是相当良性的。但如果应用其他限制,例如打开文件句柄限制或进程分叉限制,这可能会出现问题。
(ulimit -c 无限制;urxvt -e“./app1”)
注意这不适用于 GNOME 终端或 Unicode RXVT 的客户端-服务器变体。这两者都不会直接调用终端模拟器作为脚本的子脚本。它们通过服务器进程执行远程调用,该进程不会具有也不会获取脚本中设置的资源限制。
让 GNOME 终端运行一个运行ulimit
.
请记住,您必须从下向上构建它。
- 您需要实际的 shell 来执行命令列表的工作
ulimit -c 无限;执行“./app1”
- 要将此命令列表传递给
sh
它需要所有一个论点之后-c
,所以需要引用:sh -c "ulimit -c unlimited ; exec \"./app1\""
- 要将
sh
调用传递到 GNOME 终端,也需要所有一个论点after-e
,因此需要应用第二级引用:gnome-terminal -e 'sh -c "ulimit -c unlimited ; exec \"./app1\""'
答案2
ulimit -c
不会给你硬限制,它会给你软限制。硬限制只能由超级用户更改,软限制可以由任何人更改。更改软限制只会影响该过程。
在 MacOS 上:
$ charlie on macbook in ~
❯❯ ulimit -aS
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 7168
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 709
virtual memory (kbytes, -v) unlimited
$ charlie on macbook in ~
❯❯ ulimit -aH
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) unlimited
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 65532
cpu time (seconds, -t) unlimited
max user processes (-u) 1064
virtual memory (kbytes, -v) unlimited
在您的情况下,硬限制可能是无限制的,软限制默认为 0。您可以通过使用ulimit
或直接编辑文件来更改该过程中的软限制/proc/FD/limits
。