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


13

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

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

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

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

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

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

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

回答:


22

通常のsystemdサービスだけでは、環境変数や物事の限定セットを持っている/ etc / profileをを/etc/profile.dbashrcに関連ファイルが設定されていません。

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

次の例でroscore/opt/ros/kinetic/bin/roscoresystemdサービスがバイナリまたはスクリプトにフルパスで構成されている必要があるため、それが存在することを前提としています。


1つの可能性はEnvironmentsystemdサービスでオプションを使用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=する必要があるかもしれません。simpleforking


通常のログインの環境変数について言及するのを忘れたので、を更新します

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


もう1つの質問:という名前のサービスファイルにいくつかの環境変数を設定した場合my_own.serviceRequires=my_own.serviceそれらを含む他のサービスファイルはこれらの環境変数を継承できますか?
Yvesが

1
いいえ、環境は継承されません。
トーマス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.