Shell-Script
如何在破折號腳本中執行單行 posix 破折號命令以啟用核心轉儲?
出於不相關的目的,我被迫生成一個僅適用於 posix sh 的腳本。
在我的腳本中,我檢查了系統是否允許創建核心轉儲,然後如果限制設置為 0,我希望腳本嘗試執行
ulimit -c unlimited
。我在腳本中嘗試過,但沒有成功:
sh -c "ulimit -c unlimited"
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
當然,您的系統可能還有其他可能影響創建核心文件的因素。