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

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

私はROSを使用しており、Ubuntuに正しくインストールされました。

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

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

私は次のリンクを読んだ。https://askubuntu.com/questions/814/how-to-run-scripts-on-start-up

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

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

/etc/profileまた、これらの環境変数を設定し、コマンドのサービスファイルを作成するという考えもありますroscore。大丈夫ですか?

答え1

通常、systemdサービスには制限された環境変数セットのみがあり、および関連ファイルの内容は/etc/profile設定されません。/etc/profile.dbashrc

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

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


1つの可能性は、サービスでこのオプションを使用することですEnvironment。簡単なサービスは次のとおりです。systemdsystemd

[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/ros/roscore.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/ros/roscore.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これは通常のログインで選択する必要があります。

答え2

これを試すことができます

[Unit]
Description=Run command with source /opt/ros/kinetic/setup.bash

[Service]
Type=simple
ExecStart=/bin/bash -c 'source /opt/ros/kinetic/setup.bash && /opt/ros/kinetic/bin/roscore'

[Install]
WantedBy=multi-user.target

関連情報