Shell-Script

如何在破折號腳本中執行單行 posix 破折號命令以啟用核心轉儲?

  • August 3, 2021

出於不相關的目的,我被迫生成一個僅適用於 posix sh 的腳本。

在我的腳本中,我檢查了系統是否允許創建核心轉儲,然後如果限制設置為 0,我希望腳本嘗試執行ulimit -c unlimited

我在腳本中嘗試過,但沒有成功:

  1. sh -c "ulimit -c unlimited"
  2. ulimit -c unlimited

在我的一般 zsh 終端中嘗試第一個失敗,但是如果我執行 sh 然後第二個命令手動執行。

因此,為了放置在更大的 posix sh 腳本中,我如何執行這些命令來啟用核心轉儲?

ulimit在標準中確實沒有定義,它似乎只知道ulimit -f,所以我們不能指望標準來避免任何問題。

但是,ulimit -c unlimited它適用於我嘗試過的所有 shell:Bash、Dash(Debian 的/bin/sh)、Busybox、zsh、ksh 和 yash。我不知道 BSD 上的 ksh 變體。

請注意,設置的資源限制ulimit是從程序繼承到其子程序的,因此腳本中的設置僅影響腳本啟動的程序。也就是說,這sh -c "ulimit -c unlimited"將是無用的:它只會更改該特定外殼的限制,該外殼在設置限制後立即退出。

當然,設置限制可能會失敗,例如可能會設置硬限制,從而阻止您提高限制。因此,您可能希望對ulimit呼叫進行一些錯誤檢查:

if ! ulimit -c unlimited; then
   echo "error: something went wrong when setting core dump limit" >&2
   exit 1
fi
# do something here that might dump core

這應該適用於大多數 shell,但它看起來像在 zsh 中,ulimit總是返回成功狀態,即使失敗也不給出錯誤(很奇怪)。所以在zsh中,你需要在之後閱讀限制以檢查它是否設置正確,例如:

ulimit -c unlimited
if [ "$(ulimit -c)" != unlimited ]; then
   echo "error: core dump limit wasn't set" >&2
   exit 1
fi

當然,您的系統可能還有其他可能影響創建核心文件的因素。

引用自:https://unix.stackexchange.com/questions/660231