如何運行腳本就像在啟動時運行一樣?

如何運行腳本就像在啟動時運行一樣?

我有一個在啟動時運行的腳本,但是它給了我在日誌檔案中看到的錯誤。當我手動運行它時,它運行良好 - 可能環境已更改。

有沒有辦法在啟動時運行這樣的腳本而無需重新啟動?

腳本位於/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 的預設值。

答案3

如果沒有有關腳本正在執行的操作以及遇到的錯誤的更多信息,則很難給出準確的答案。這麼說來,大概就是可能的重新建立環境,但這可能會非常困難,需要卸載或綁定安裝檔案系統或其他類似有趣的事情。

另一種方法是使用類似的東西創建虛擬機虛擬盒子或者鍵盤虛擬機並使用它執行調試,允許您根據需要重新啟動虛擬機,而無需重新啟動主機。

相關內容