我有一個在啟動時運行的腳本,但是它給了我在日誌檔案中看到的錯誤。當我手動運行它時,它運行良好 - 可能環境已更改。
有沒有辦法在啟動時運行這樣的腳本而無需重新啟動?
腳本位於/etc/init.d
帶有符號連結的/etc/rc5.d/S97mounter.sh
.
答案1
你可以以 root 身分運行
env - scriptname
這將在運行腳本之前清除您的環境,但是,它也會保留您的shell
.若要清除環境並將 shell 設定為sh
,請執行下列操作:
env -i /bin/sh -c scriptname
然後,這將使用運行腳本/bin/sh
。但是,這不會完全模擬啟動環境,因為這不計入當時可能未運行的其他服務。
我發現了一個類似的模擬 crontab 環境的問題,並且發布了一個非常有用的解決方案嗯嗯。
使用它,您可以在腳本中運行它並重新啟動主機,然後使用環境檔案載入您的環境:
啟動腳本的一部分:
env > /var/tmp/bootenv
然後在正常運作時設定相同的啟動環境,執行以下操作:
env - `cat /var/tmp/bootenv` /bin/sh -c scriptname
答案2
當程式透過使用者會話而不是啟動腳本啟動時,有些事情可能會有所不同:
- 程式繼承了許多環境變數(包括
PATH
,,HOME
…)。 - 該程式繼承了幾個檔案描述符,包括終端。
- 限制可能不同。
要在最小環境下運行程式並關閉標準文件描述符,您可以使用類似
env -i PATH=/bin:/usr/bin:/sbin:/usr/sbin myprogram </dev/null >/dev/null 2>/dev/null
檢查init
系統上的手冊頁或其他文檔,以了解它定義了哪些環境變數。許多打算作為守護程式運行的程式只需要PATH
它就可以了。上面的值PATH
是 Debian 上 init 的預設值。