web-dev-qa-db-ja.com

systemdサービスで環境変数を設定する方法

Ubuntuに正しくインストールされているROSを使用しています。

ROSを実行するには、最初にsource /opt/ros/kinetic/setup.bash、次にroscoreを実行する必要があります。 roscoresource setup.bashなしで実行すると、コマンドroscoreが見つかりません。

ここで、システムの起動中にROSを実行したいと思います。

私はこのリンクを読みました: https://askubuntu.com/questions/814/how-to-run-scripts-on-start-up

カスタムサービスファイルを作成して/etc/systemd/system/に入れるだけでよいようです。ただし、roscoreを実行する前に、必要な環境変数をセットアップするためにsource setup.bashを実行する必要があるため、何をすべきかわかりません。

サービスファイルで環境変数を設定することは可能ですか?私の必要に応じて、roscoreの実行だけでなく、システム全体にもこれらの環境変数を設定する必要があります。

私は別のアイデアを持っています。つまり、これらの環境変数を/etc/profileに設定し、コマンドroscoreに対してのみサービスファイルを書き込みます。それは機能しますか?

12
Yves

通常、systemdサービスには、/ etc/profile/etc/profile.dおよびbashrc関連ファイルが設定されていません。

systemdサービスの環境変数を追加するには、さまざまな可能性があります。

次の例では、roscoreサービスにバイナリまたはスクリプトをフルパスで構成する必要があるため、systemd/opt/ros/kinetic/bin/roscoreにあると想定しています。


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

もう1つのオプションは、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バイナリに精通しておらず、Type=simple(デフォルトで通常は不要)からforkingに変更する必要があるかもしれません。最初の2つの例。


pdate、通常のログインの環境変数について言及するのを忘れていたため。

通常のログインの場合、/ opt/ros/kinetic/setup.bash/ etc/profileにコピーまたはシンボリックリンクできます.d/ros.shこれは、通常のログインで供給される必要があります。

20
Thomas