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


113

次のコマンドを使用して、起動後に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

どちらも機能しません。



こんにちは@WillemK、私はすでにこのページを見ました。私が見つけたこの問題は、私はちょうど置き換えることはできませんですexecExecStart=。加えて、私はこれまでupstartを使用したことがありません。
macourtney7

1
スクリプトのパスの前のドットは非常に疑わしいように見えます。
アンドレアラザロット

@AndreaLazzarotto私はOPは、希望の端末におけるので、スクリプトの道のOPを実行しようとしていると思う....
ジョージUdosen

こんにちは@AndreaLazzarotto、これは正しいです。混乱をおかけして申し訳ありません。
-macourtney7

回答:


144

あなたの.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


注目と更新
ジョージ・ウドセン

1
このおかげで、私はあなたの提案に基づいてファイルを作成しました。実行するsudo systemctl start sparkと、次のエラーが表示されますFailed to start spark.service: Unit spark.service is not loaded properly: Invalid argument. See system logs and 'systemctl status spark.service' for details.
。– macourtney7

主要部分は、systemctl status spark.service次のとおりです。Executable path is not absolutespark.service: Service lacks both ExecStart= and ExecStop= setting. Refusing.
macourtney7

問題は、1)Sparkバイナリパス(サービスファイルにあるものを置き換える必要がある)、2)Sparkにシャットダウンコマンドがあることです。3)私があなたに与えたリンクを通りましたか。私は火花を使用しないので、それらを供給します
ジョージウドセン

?あなたの答えのおかげで@GeorgeUdosen、私の質問は、私は再起動後に特定のコマンドの下で火花を実行する方法の質問はここにあるさaskubuntu.com/questions/979498/...
Soheil Pourbafrani

2

これにより/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を含めないことにしました。


systemd docsには少し混乱していますが、そうしないとType=oneshot RemainAfterExit=yes、systemdは、カスタムスクリプトがいくつかのプロセスを実行したままにしない限り、タスクを非アクティブと見なします。
ピーターランバーグ

@PeterLamberg私もsystemdのドキュメントを読んでみましたが、ここでは両方とも;)です。私はそれらがあまり明確ではなかったことを覚えていますが、私が投稿した答えは複数のシステムでうまくいきます(私は時々このページを再訪します)「非アクティブ」と見なされるため、連続する「開始」呼び出しごとにスクリプトが再実行されるということですか?シェルスクリプトの場合は予想どおりだと思うからです。再起動する前に、実際に実行されていないものを「停止」しなければならないとしたら、それは奇妙だと思うでしょう。
リュック
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.