2017-10-04 170 views
1

我正在開發一些服務腳本,需要在Raspbian(Jessie)上啓動時執行,並且我決定使用systemd。我剛開始閱讀一些關於如何使用它的快速教程,但是我遇到了環境方面的問題。如何爲systemd服務的進程加載環境變量?

所執行的過程需要(在他們的代碼),我在一個shell腳本設置一些環境變量,但他們不加載,儘管使用的EnvironmentFile = /路徑/要/我的/文件...我有一個服務執行一個Python3腳本和另一個Node.js應用程序。

自昨天以來,我一直在尋找替代解決方案,但似乎沒有任何工作......也許我只是不明白systemd是如何工作的? 必須能夠這樣做,那麼我問你...

這裏是我的單元文件:

對於python腳本:

[Unit] 
Description=My awesome python script 
After=multi-user.target 

[Service] 
ExecStart=/usr/local/bin/python3.6 /home/pi/Desktop/myawesomescript.py 
Restart=Always 
RestartSec=5 
StandardOutput=syslog 
StandardError=syslog 
SyslogIdentifier=mypython 
User=pi 
EnvironmentFile=/home/pi/.bash_vars 

[Install] 
WantedBy=multi-user.target 

節點應用:

[Unit] 
Description=My awesome Node.js socket.io app 
Requires=After=mypython.service # Requires the python script to be running 

[Service] 
ExecStart=/usr/bin/node /home/pi/Desktop/myawesomenodeapp/src/index.js 
Restart=always 
RestartSec=10 
StandardOutput=syslog 
StandardError=syslog 
SyslogIdentifier=mynodeapp 
User=pi 
EnvironmentFile=/home/pi/.bash_vars 

[Install] 
WantedBy=multi-user.target 

感謝您抽出寶貴的時間和歉意爲我的英語不好!

PS:請讓我知道如果你需要更多的信息

+0

萬一檢查出[不死](https://immortal.run/post/run.yml/) – nbari

+0

事實上,DarkKnight的回答讓我明白我錯過了。 無論如何謝謝你的建議,我會看看,看看它的功能可能是有用的! – ozonePowered

回答

0

環境可以在如下systemd服務文件中設置下Exec選

Environment=LD_LIBRARY_PATH=/usr/lib 

下面是systemd環境的官方文檔/ EnvironmentFile使用

環境=

設置環境VA用於執行過程的riables。採用空格分隔的變量賦值列表。此選項可能會多次指定,在這種情況下,所有列出的變量都將被設置。如果同一個變量設置了兩次,後面的設置將覆蓋較早的設置。如果將空字符串分配給此選項,則重置環境變量列表,所有之前的分配都不起作用。變量擴展不在字符串內部執行,但是,擴展名是可能的。 $字符沒有特殊含義。如果需要分配包含值空格或等號給一個變量,用雙引號(「)表示分配

例:

環境=」 VAR1 = WORD1 WORD2" VAR2 = WORD3「VAR3 = $ word 5 6「 給出了具有值」word1 word2「,」word3「,」$ word 5 6「的三個變量」VAR1「,」VAR2「,」VAR3「

查看environ(7)有關環境變量的詳細信息。

EnvironmentFile =

與Environment =類似,但是從文本文件讀取環境變量。文本文件應該包含以換行分隔的變量賦值。空行,沒有「=」分隔符的行,或者以行開頭的行;或#將被忽略,這可以用於評論。以反斜槓結尾的行將與下一行連接,允許多行變量定義。除非你使用雙引號(「),除非你使用雙引號(」),否則解析器會剝去開始和結尾的空格。

傳遞的參數應該是絕對文件名或通配符表達式,可選地以「 - 」作爲前綴,文件不存在,它不會被讀取,也不會記錄任何錯誤或警告消息。該選項可以多次指定,在這種情況下,將讀取所有指定的文件。如果將空字符串分配給此選項,則文件列表讀取被重置,所有先前的分配都不起作用

在執行該過程之前不久,將讀取此指令列出的文件(更具體地說,在之前的單元狀態的所有過程都已終止之後,這意味着您可以生成這些文件在一個單元狀態,並在下一個選項中讀取它)。

這些文件的設置將覆蓋使用Environment =進行的設置。如果從這些文件中設置兩次相同的變量,則文件將按照它們指定的順序讀取,而後面的設置將覆蓋較早的設置。

更多here

+0

謝謝,我其實是紅的,但也許有點太快哈哈!我認爲環境文件必須是導出變量的bash腳本文件...我通過更正語法來使其工作 – ozonePowered