通常のsystemd
サービスだけでは、環境変数や物事の限定セットを持っている/ etc / profileを、を/etc/profile.dとbashrcに関連ファイルが設定されていません。
systemd
サービスの環境変数を追加するには、さまざまな可能性があります。
次の例でroscore
は/opt/ros/kinetic/bin/roscore
、systemd
サービスがバイナリまたはスクリプトにフルパスで構成されている必要があるため、それが存在することを前提としています。
1つの可能性はEnvironment
、systemd
サービスでオプションを使用systemd
することです。簡単なサービスは次のようになります。
[root@localhost ~]# cat /etc/systemd/system/ros.service
[Unit]
Description=ROS Kinetic
After=sshd.service
[Service]
Type=simple
Environment="One=1" "Three=3"
Environment="Two=2"
Environment="Four=4"
ExecStart=/opt/ros/kinetic/bin/roscore
[Install]
WantedBy=multi-user.target
すべての環境変数をファイルに入れEnvironmentFile
て、systemd
サービスのオプションで読み取ることができます。
[root@localhost ~]# cat /etc/systemd/system/ros.env
One=1
Three=3
Two=2
Four=4
[root@localhost ~]# cat /etc/systemd/system/ros.service
[Unit]
Description=ROS Kinetic
After=sshd.service
[Service]
Type=simple
EnvironmentFile=/etc/systemd/systemd/ros.env
ExecStart=/opt/ros/kinetic/bin/roscore
[Install]
WantedBy=multi-user.target
別のオプションは、ros
バイナリ用のラッパースクリプトを作成し、systemd
サービスからそのラッパースクリプトを呼び出すことです。スクリプトは、chmod +755 /opt/ros/kinetic/bin/roscore.startup
そのファイルの作成後に確実に実行されるように、実行可能である必要があります。
[root@localhost ~]# cat /opt/ros/kinetic/bin/roscore.startup
#!/bin/bash
source /opt/ros/kinetic/setup.bash
roscore
[root@localhost ~]# cat /etc/systemd/system/ros.service
[Unit]
Description=ROS Kinetic
After=sshd.service
[Service]
Type=simple
ExecStart=/opt/ros/kinetic/bin/roscore.startup
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
変更をアクティブにするには、サービスファイルを編集した後に実行する必要があることに注意してください。システムブートでサービスを有効にするには、を入力する必要がありますsystemctl enable ros
。
私はroscore
バイナリに慣れていないため、最初の2つの例では(デフォルトであり、通常は不要)からに変更Type=
する必要があるかもしれません。simple
forking
通常のログインの環境変数について言及するのを忘れたので、を更新します。
通常のログインの場合、/ opt / ros / kinetic / setup.bashを/etc/profile.d/ros.shにコピーまたはシンボリックリンクすることができます。
my_own.service
、Requires=my_own.service
それらを含む他のサービスファイルはこれらの環境変数を継承できますか?