使用正确的链加载命令。

使用正确的链加载命令。

我们的实验室中有以下脚本(在 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 系列工具集:

因此,可以使用softlimitnosh 工具集作为示例来运行:

gnome-terminal -t A --tab -e "softlimit --coresize unlimited ./app1"

在脚本中使用子 shell。

这也适用于终端仿真器进程的限制。在这种情况下,这将是相当良性的。但如果应用其他限制,例如打开文件句柄限制或进程分叉限制,这可能会出现问题。

(ulimit -c 无限制;urxvt -e“./app1”)

注意这不适用于 GNOME 终端或 Unicode RXVT 的客户端-服务器变体。这两者都不会直接调用终端模拟器作为脚本的子脚本。它们通过服务器进程执行远程调用,该进程不会具有也不会获取脚本中设置的资源限制。

让 GNOME 终端运行一个运行ulimit.

请记住,您必须从下向上构建它。

  1. 您需要实际的 shell 来执行命令列表的工作
    ulimit -c 无限;执行“./app1”
  2. 要将此命令列表传递给sh它需要所有一个论点之后-c,所以需要引用:
    sh -c "ulimit -c unlimited ; exec \"./app1\""
  3. 要将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

相关内容