web-dev-qa-db-ja.com

systemdを使用して起動時に単一のコマンドを実行するにはどうすればよいですか?

次のコマンドを使用して、起動後にApache Sparkクラスターを起動したいと思います。

Sudo ./path/to/spark/sbin/start-all.sh

次に、システムがリブート/シャットダウンの準備をしたときに次のコマンドを実行します。

Sudo ./path/to/spark/sbin/stop-all.sh

どうすれば始められますか?構築できる基本的なテンプレートはありますか?

私は非常にシンプルなものを使用しようとしました(ファイル:/lib/systemd/system/spark.service):

[Unit]
Description=Spark service

[Service]
ExecStart=Sudo ./path/to/spark/sbin/start-all.sh

どちらも機能しません。

105
macourtney7

.serviceファイルは次のようになります。

[Unit]
Description=Spark service

[Service]
ExecStart=/path/to/spark/sbin/start-all.sh

[Install]
WantedBy=multi-user.target

.serviceファイルを有効にして使用するには、さらにいくつかの手順を実行します。

  1. /lib/systemd/systemという名前でmyfirst.serviceフォルダーに配置します

  2. スクリプトを実行可能にする:

    chmod u+x /path/to/spark/sbin/start-all.sh
    
  3. 始めよう:

    Sudo systemctl start myfirst
    
  4. 起動時に実行できるようにします:

    Sudo systemctl enable myfirst
    
  5. やめて

    Sudo systemctl stop myfirst
    

ノート:

  1. デフォルトのサービスユーザーはすでにrootであるため、サービスでSudoを使用してSparkを起動する必要はありません。

  2. その他のsystemdオプションについては、以下のリンクをご覧ください。

更新

上記の内容は基本的なものです。sparkの完全なセットアップを次に示します。

[Unit]
Description=Apache Spark Master and Slave Servers
After=network.target
After=systemd-user-sessions.service
After=network-online.target

[Service]
User=spark
Type=forking
ExecStart=/opt/spark-1.6.1-bin-hadoop2.6/sbin/start-all.sh
ExecStop=/opt/spark-1.6.1-bin-hadoop2.6/sbin/stop-all.sh
TimeoutSec=30
Restart=on-failure
RestartSec=30
StartLimitInterval=350
StartLimitBurst=10

[Install]
WantedBy=multi-user.target

サービスをセットアップするには:

Sudo systemctl start spark.service
Sudo systemctl stop spark.service
Sudo systemctl enable spark.service

参考文献

以下のリンクをお読みください。 Sparkは複雑なセットアップなので、Ubuntuのinitサービスと統合する方法を理解する必要があります。

https://datasciencenovice.wordpress.com/2016/11/30/spark-stand-alone-cluster-as-a-systemd-service-ubuntu-16-04centos-7/

https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files

https://www.freedesktop.org/software/systemd/man/systemd.unit.html

131
George Udosen

これにより、最小限のサービスファイルを使用して、ブート時に(rootとして)/root/boot.shが作成および実行されます。

bootscript=/root/boot.sh
servicename=customboot

cat > $bootscript <<EOF
#!/usr/bin/env bash
echo "$bootscript ran at $(date)!" > /tmp/it-works
EOF

chmod +x $bootscript

cat > /etc/systemd/system/$servicename.service <<EOF
[Service]
ExecStart=$bootscript
[Install]
WantedBy=default.target
EOF

systemctl enable $servicename

あなたはできる Ctrl+C これをルート端末に。

別の$bootscriptを使用するなど、パラメーターを変更するには、その変数を手動で設定し、コマンドをコピーするときにその行をスキップします。

コマンドを実行した後、お気に入りのエディターを使用してブートスクリプトを編集できます。次回のブート時に実行されます。次を使用して、すぐに実行することもできます。

systemctl start $servicename

すべてのステップはSudoで実行できますが、少し複雑で、一部のシステムにはSudoがインストールされていないため、使用する前にサンプルを変更する必要があります。したがって、この例にはSudoを含めないことにしました。

2
Luc