回答編集履歴

10

コメントより

2023/02/07 05:16

投稿

86ps
86ps

スコア66

test CHANGED
@@ -34,4 +34,41 @@
34
34
  上記の「別の方法としては、…」のような、起動中にsystemdに環境変数を設定する方法の方が良いと思います。
35
35
  また、systemdがNode-REDを起動させる前に、systemdに環境変数を設定するサービスを作っても良いと思いますが、noderedのために環境変数を一つ追加するだけであれば、nodered.service の```ExecStartPre=```で、systemdに環境変数を設定するだけで十分だと思います。
36
36
 
37
+ ---
38
+ コメントより
39
+ /lib/systemd/system/nodered.service の内容を調べてみましたが、ユーザー権限で実行するみたいですね。確認してなくてすみません。。
37
40
 
41
+ Node-REDの環境変数の設定方法について調べてみたら、以下のページが見つかりました。
42
+
43
+ 環境変数を利用する : Node-RED日本ユーザ会
44
+ https://nodered.jp/docs/user-guide/environment-variables
45
+
46
+ 「Node-REDユーザディレクトリ```~/.node-red```内の```environment```という名称のファイル内に配置することで定義できます。」とありました。
47
+ しかし、このenvironmentファイルでもシェルが実行されないと思われるため
48
+
49
+ 以下のようにnodered.serviceを起動する前に、~/.node-red/environment を更新するサービスを作成
50
+
51
+ /etc/systemd/system/myip-in-nodered.service
52
+ ``` ini
53
+ [Unit]
54
+ Description=Update or Add MYIP in ~/.node-red/environment
55
+ Before=nodered.service
56
+
57
+ [Service]
58
+ Type=oneshot
59
+ # ~/.node-red/environment にMYIPを設定
60
+ ExecStart=/bin/sh -c "if grep -q MYIP <homeディレクトリ>/.node-red/environment; then sed -i 's/MYIP=.*/MYIP=$(hostname -I)/g' <homeディレクトリ>/.node-red/environment; else echo MYIP=$(hostname -I) >> <homeディレクトリ>/.node-red/environment; fi"
61
+ User=<ユーザー名>
62
+ Group=<グループ名>
63
+
64
+ [Install]
65
+ WantedBy=multi-user.target
66
+ ```
67
+
68
+ ``` shell
69
+ $ sudo systemctl enable myip-in-nodered
70
+ ```
71
+
72
+ このような方法で、できないでしょうか。
73
+ 上記実行する場合、/lib/systemd/system/nodered.service に ```EnvironmentFile=-<ホームディレクトリ>/.node-red/environment```
74
+ が設定されているか確認してください。

9

回答の修正

2023/02/06 23:02

投稿

86ps
86ps

スコア66

test CHANGED
@@ -28,24 +28,7 @@
28
28
 
29
29
  また、nodered.service が起動する前に /etc/environment を変更するサービスを作れたとしても、/etc/environment を変更する前に /etc/environment の環境変数が適用されてしまう可能性があります。
30
30
 
31
- またどうしても /etc/environment を利した以下ような、シャットダウ /etc/environment を更新するビスを作と良いでしょう
32
-
33
- ``` ini
34
- [Unit]
35
- Description= Update or Add MYIP in /etc/environment
36
- Before=shutdown.target
37
- DefaultDependencies=no
38
-
39
- [Service]
40
- Type=oneshot
41
- ExecStart=</etc/environmentを更新するスクリプトのパス>
42
- TimeoutStartSec=0
43
-
44
- [Install]
45
- WantedBy=shutdown.target
46
- ```
47
-
48
- しかし、/etc/environment は pam_env.so によってログイン時に読み込まれますが、これについての情報が少ない上に私はPAMについて詳しくないため断言はできないですが、再起動やログインをせずに起動中に/etc/environment を即座に適用する方法はおそらくないです。(そもそもPAM自体、ユーザ認証のためのものですから、ログイン後に使われる環境変数のために /etc/environment が存在するのでしょう。)
31
+ さらに言えばnodered.service が起動する前に、/etc/environment が適される保証はありません。起動時のつどこログイン(pam認証)さているかが不明瞭なためです。/etc/environment は pam_env.so によってログイン時に読み込まれますがこれについて情報が少い上に私はPAMについて詳しくないため断言はできないですが再起動やログイをせず起動中に/etc/environment を適用する方法はおそらくないです。(そもそもPAM自体、ユザ認証のためのものですから、ログイン後に使われ環境変数のために /etc/environment が存在するのでしょう。)
49
32
  したがって、/etc/environment で設定するのは好ましくないです。
50
33
 
51
34
  上記の「別の方法としては、…」のような、起動中にsystemdに環境変数を設定する方法の方が良いと思います。

8

修正

2023/02/06 22:42

投稿

86ps
86ps

スコア66

test CHANGED
@@ -28,9 +28,6 @@
28
28
 
29
29
  また、nodered.service が起動する前に /etc/environment を変更するサービスを作れたとしても、/etc/environment を変更する前に /etc/environment の環境変数が適用されてしまう可能性があります。
30
30
 
31
- 基本的に、起動中に /etc/environment を変更して適用するのはできないと考えていいです。できたとしても好ましくありません。上記の「別の方法としては、…」のような、起動中にsystemdに環境変数を設定する方法の方が良いと思います。
32
- また、systemdがNode-REDを起動させる前に、systemdに環境変数を設定するサービスを作っても良いと思いますが、noderedのために環境変数を一つ追加するだけであれば、nodered.service の```ExecStartPre=```で、systemdに環境変数を設定するだけで十分だと思います。
33
-
34
31
  また、どうしても /etc/environment を利用したいのであれば、以下のような、シャットダウン時に /etc/environment を更新するサービスを作ると良いでしょう
35
32
 
36
33
  ``` ini
@@ -48,3 +45,10 @@
48
45
  WantedBy=shutdown.target
49
46
  ```
50
47
 
48
+ しかし、/etc/environment は pam_env.so によってログイン時に読み込まれますが、これについての情報が少ない上に私はPAMについて詳しくないため断言はできないですが、再起動やログインをせずに起動中に/etc/environment を即座に適用する方法はおそらくないです。(そもそもPAM自体、ユーザ認証のためのものですから、ログイン後に使われる環境変数のために /etc/environment が存在するのでしょう。)
49
+ したがって、/etc/environment で設定するのは好ましくないです。
50
+
51
+ 上記の「別の方法としては、…」のような、起動中にsystemdに環境変数を設定する方法の方が良いと思います。
52
+ また、systemdがNode-REDを起動させる前に、systemdに環境変数を設定するサービスを作っても良いと思いますが、noderedのために環境変数を一つ追加するだけであれば、nodered.service の```ExecStartPre=```で、systemdに環境変数を設定するだけで十分だと思います。
53
+
54
+

7

文法の修正

2023/02/06 17:41

投稿

86ps
86ps

スコア66

test CHANGED
@@ -26,12 +26,12 @@
26
26
  systemd unit ファイルの書き方が間違っています。
27
27
  ```ExecStartPre=```ではなく、```ExecStart=```にするべきです。
28
28
 
29
- また、nodered.serviceが起動する前に/etc/environment変更するサービスを作れたとしても、/etc/environmentを変更する前に/etc/environmentの環境変数が適用されてしまう可能性があります。
29
+ また、nodered.service が起動する前に /etc/environment変更するサービスを作れたとしても、/etc/environment を変更する前に /etc/environment の環境変数が適用されてしまう可能性があります。
30
30
 
31
- 基本的に、起動中に/etc/environment を変更して適用するのはできないと考えていいです。できたとしても好ましくありません。上記の「別の方法としては、…」のような、起動中にsystemdに環境変数を設定する方法の方が良いと思います。
31
+ 基本的に、起動中に /etc/environment を変更して適用するのはできないと考えていいです。できたとしても好ましくありません。上記の「別の方法としては、…」のような、起動中にsystemdに環境変数を設定する方法の方が良いと思います。
32
32
  また、systemdがNode-REDを起動させる前に、systemdに環境変数を設定するサービスを作っても良いと思いますが、noderedのために環境変数を一つ追加するだけであれば、nodered.service の```ExecStartPre=```で、systemdに環境変数を設定するだけで十分だと思います。
33
33
 
34
- また、どうしても/etc/environmentを利用したいのであれば、以下のようなシャットダウン時に/etc/environment を更新するサービスを作ると良いでしょう
34
+ また、どうしても /etc/environment を利用したいのであれば、以下のようなシャットダウン時に /etc/environment を更新するサービスを作ると良いでしょう
35
35
 
36
36
  ``` ini
37
37
  [Unit]

6

少し修正

2023/02/06 16:50

投稿

86ps
86ps

スコア66

test CHANGED
@@ -35,7 +35,7 @@
35
35
 
36
36
  ``` ini
37
37
  [Unit]
38
- Description= Description=Update or Add MYIP in /etc/environment
38
+ Description= Update or Add MYIP in /etc/environment
39
39
  Before=shutdown.target
40
40
  DefaultDependencies=no
41
41
 

5

更に追記

2023/02/06 16:49

投稿

86ps
86ps

スコア66

test CHANGED
@@ -31,4 +31,20 @@
31
31
  基本的に、起動中に/etc/environment を変更して適用するのはできないと考えていいです。できたとしても好ましくありません。上記の「別の方法としては、…」のような、起動中にsystemdに環境変数を設定する方法の方が良いと思います。
32
32
  また、systemdがNode-REDを起動させる前に、systemdに環境変数を設定するサービスを作っても良いと思いますが、noderedのために環境変数を一つ追加するだけであれば、nodered.service の```ExecStartPre=```で、systemdに環境変数を設定するだけで十分だと思います。
33
33
 
34
+ また、どうしても/etc/environmentを利用したいのであれば、以下のようなシャットダウン時に/etc/environment を更新するサービスを作ると良いでしょう
34
35
 
36
+ ``` ini
37
+ [Unit]
38
+ Description= Description=Update or Add MYIP in /etc/environment
39
+ Before=shutdown.target
40
+ DefaultDependencies=no
41
+
42
+ [Service]
43
+ Type=oneshot
44
+ ExecStart=</etc/environmentを更新するスクリプトのパス>
45
+ TimeoutStartSec=0
46
+
47
+ [Install]
48
+ WantedBy=shutdown.target
49
+ ```
50
+

4

誤字修正

2023/02/06 15:52

投稿

86ps
86ps

スコア66

test CHANGED
@@ -28,7 +28,7 @@
28
28
 
29
29
  また、nodered.serviceが起動する前に、/etc/environmentの変更するサービスを作れたとしても、/etc/environmentを変更する前に/etc/environmentの環境変数が適用されてしまう可能性があります。
30
30
 
31
- 基本的に、/etc/environment を変更するのはできないと考えていいです。できたとしても好ましくありません。上記の「別の方法としては、…」のような、起動中にsystemdに環境変数を設定する方法の方が良いと思います。
31
+ 基本的に、起動中に/etc/environment を変更して適用するのはできないと考えていいです。できたとしても好ましくありません。上記の「別の方法としては、…」のような、起動中にsystemdに環境変数を設定する方法の方が良いと思います。
32
32
  また、systemdがNode-REDを起動させる前に、systemdに環境変数を設定するサービスを作っても良いと思いますが、noderedのために環境変数を一つ追加するだけであれば、nodered.service の```ExecStartPre=```で、systemdに環境変数を設定するだけで十分だと思います。
33
33
 
34
34
 

3

追記2より

2023/02/06 15:41

投稿

86ps
86ps

スコア66

test CHANGED
@@ -9,6 +9,8 @@
9
9
  # MYIP変更
10
10
  sed -i "s/MYIP=.*/MYIP=$(hostname -I)/g" /etc/environment
11
11
  ```
12
+
13
+
12
14
  別の方法としては、
13
15
  /lib/systemd/system/nodered.service の中身の、ExecStartPreを以下のように設定すると良いと思います
14
16
  ``` ini
@@ -16,5 +18,17 @@
16
18
  ExecStartPre=/bin/sh -c "/bin/systemctl set-environment MYIP=$(/bin/hostname -I)"
17
19
  ```
18
20
  このようにすると、systemdがNode-REDを起動させる前に、systemdに環境変数MYIPを「/bin/hostname -I」のコマンドの結果に設定するシェルが実行されます。
21
+ これであればNode-REDを起動させる前に、(/bin/hostname -I) の結果がsystemd で適用され、Node-REDとそれ以降に起動したサービスでこの環境変数が使えます。
22
+
23
+ ---
24
+ 追記2より
25
+
26
+ systemd unit ファイルの書き方が間違っています。
27
+ ```ExecStartPre=```ではなく、```ExecStart=```にするべきです。
28
+
29
+ また、nodered.serviceが起動する前に、/etc/environmentの変更するサービスを作れたとしても、/etc/environmentを変更する前に/etc/environmentの環境変数が適用されてしまう可能性があります。
30
+
31
+ 基本的に、/etc/environment を変更するのはできないと考えていいです。できたとしても好ましくありません。上記の「別の方法としては、…」のような、起動中にsystemdに環境変数を設定する方法の方が良いと思います。
32
+ また、systemdがNode-REDを起動させる前に、systemdに環境変数を設定するサービスを作っても良いと思いますが、noderedのために環境変数を一つ追加するだけであれば、nodered.service の```ExecStartPre=```で、systemdに環境変数を設定するだけで十分だと思います。
19
33
 
20
34
 

2

少し修正

2023/02/06 05:52

投稿

86ps
86ps

スコア66

test CHANGED
@@ -15,6 +15,6 @@
15
15
  [Service]
16
16
  ExecStartPre=/bin/sh -c "/bin/systemctl set-environment MYIP=$(/bin/hostname -I)"
17
17
  ```
18
- れは、systemdがNode-REDを起動させる前に、systemdに環境変数MYIPを「/bin/hostname -I」のコマンドの結果に設定するシェルが実行されます。
18
+ のようにすると、systemdがNode-REDを起動させる前に、systemdに環境変数MYIPを「/bin/hostname -I」のコマンドの結果に設定するシェルが実行されます。
19
19
 
20
20
 

1

少し修正

2023/02/06 05:46

投稿

86ps
86ps

スコア66

test CHANGED
@@ -15,6 +15,6 @@
15
15
  [Service]
16
16
  ExecStartPre=/bin/sh -c "/bin/systemctl set-environment MYIP=$(/bin/hostname -I)"
17
17
  ```
18
- これは、Node-REDを起動る前に、systemdに環境変数MYIPを「/bin/hostname -I」のコマンドの結果に設定するシェルスクリプトが実行されます。
18
+ これは、systemdがNode-REDを起動させる前に、systemdに環境変数MYIPを「/bin/hostname -I」のコマンドの結果に設定するシェルが実行されます。
19
19
 
20
20