在非互動式會話中填充環境

在非互動式會話中填充環境

我正在開發一個運行 Yocto Poky 作為發行版的嵌入式設備。

最終產品將具有多個由 啟動的應用程式SysVinit。只有一個root用戶。

我有一些腳本,它們/etc/init.d添加/etc/profile.d了我們的應用程式所需的一些環境變數。我面臨的問題是,如果我「手動」運行應用程式(所以我有一個互動式外殼),它們運行得很好,因為中的腳本/etc/profile.d/是來源的,但是當運行時SysVinit,它們找不到填充的環境(顯然)。我們使用的sh是 shell。

我讀到了不同的文件,例如.bashrc.profile以及一些變量,例如ENVBASH_ENV。我試圖在那裡定義我的變量,但沒有運氣。我發現的一個小解決方法是在登入 shell 中啟動我的主應用程式(來自SysVinit):

2:12345:once:/bin/sh -lc /usr/bin/my_app

所以我的問題是:

  1. 如何在啟動期間設定環境(也稱為不登入)或讓它SysVinit以一種好的方式完成?
  2. 在腳本中執行的匯出/etc/init.d根本不會傳播到我的環境;這是因為這些腳本是在子 shell 中運行的,而不是在當前腳本中獲取的(這將需要登入兩次),我猜,那麼如何從那裡導出變數?
  3. 我的解決方法是有效的解決方案嗎?

答案1

  1. 如何在啟動期間設定環境(也稱為無需登入)或讓 SysVinit 以良好的方式進行設定?

啟動期間環境是乾淨的(未初始化jet)。您需要透過source.命令放置環境變數sh(如果您的服務是腳本)或在程式中初始化它(即透過設定檔)。

服務腳本標頭的小範例:

#!/bin/bash

[ -f /etc/profile.d/needed.sh ] && . /etc/profile.d/needed.sh

. . .
  1. 在/etc/init.d 腳本中執行的導出根本不會傳播到我的環境,這是因為這些腳本是在子shell 中運行的,而不是在當前腳本中獲取的(這將需要登入兩次)我猜,那麼如何才能我從那裡導出變數?

source子 shell 的 env 變數或使用指定的 env 變數呼叫指令。

服務腳本標頭的小範例:

#!/bin/bash

. . .

$(BASH_ENV=/etc/profile.d/needed.sh command)
$(ENV_VAR1=value1 command)

. . .
  1. 我的解決方法是有效的解決方案嗎?

如果這是工作的話——這對服務來說是骯髒的方式。參見 1 和 2。

相關內容