
我正在開發一個運行 Yocto Poky 作為發行版的嵌入式設備。
最終產品將具有多個由 啟動的應用程式SysVinit
。只有一個root
用戶。
我有一些腳本,它們/etc/init.d
添加/etc/profile.d
了我們的應用程式所需的一些環境變數。我面臨的問題是,如果我「手動」運行應用程式(所以我有一個互動式外殼),它們運行得很好,因為中的腳本/etc/profile.d/
是來源的,但是當運行時SysVinit
,它們找不到填充的環境(顯然)。我們使用的sh
是 shell。
我讀到了不同的文件,例如.bashrc
,.profile
以及一些變量,例如ENV
和BASH_ENV
。我試圖在那裡定義我的變量,但沒有運氣。我發現的一個小解決方法是在登入 shell 中啟動我的主應用程式(來自SysVinit
):
2:12345:once:/bin/sh -lc /usr/bin/my_app
所以我的問題是:
- 如何在啟動期間設定環境(也稱為不登入)或讓它
SysVinit
以一種好的方式完成? - 在腳本中執行的匯出
/etc/init.d
根本不會傳播到我的環境;這是因為這些腳本是在子 shell 中運行的,而不是在當前腳本中獲取的(這將需要登入兩次),我猜,那麼如何從那裡導出變數? - 我的解決方法是有效的解決方案嗎?
答案1
- 如何在啟動期間設定環境(也稱為無需登入)或讓 SysVinit 以良好的方式進行設定?
啟動期間環境是乾淨的(未初始化jet)。您需要透過source
或.
命令放置環境變數sh
(如果您的服務是腳本)或在程式中初始化它(即透過設定檔)。
服務腳本標頭的小範例:
#!/bin/bash
[ -f /etc/profile.d/needed.sh ] && . /etc/profile.d/needed.sh
. . .
- 在/etc/init.d 腳本中執行的導出根本不會傳播到我的環境,這是因為這些腳本是在子shell 中運行的,而不是在當前腳本中獲取的(這將需要登入兩次)我猜,那麼如何才能我從那裡導出變數?
source
子 shell 的 env 變數或使用指定的 env 變數呼叫指令。
服務腳本標頭的小範例:
#!/bin/bash
. . .
$(BASH_ENV=/etc/profile.d/needed.sh command)
$(ENV_VAR1=value1 command)
. . .
- 我的解決方法是有效的解決方案嗎?
如果這是工作的話——這對服務來說是骯髒的方式。參見 1 和 2。