Ubuntu 16.04でユニットファイルを作成する

Ubuntu 16.04でユニットファイルを作成する

このユニットファイルは次の場所に作成されました/lib/systemd/system/menu-core-prices-update.service

[Unit]
Description = core-price-update daemon
After network.target = auditd.service

[Service]
Type = forking
ExecStart = /usr/local/bin/start-menu-core-prices-update.sh
ExecStop =  /usr/local/bin/stop-menu-core-prices-update.sh
ExecReload = /usr/local/bin/reload-stop-menu-core-prices-update.sh

[Install]
WantedBy = multi-user.target

コマンドラインから次を実行できます。

$ /usr/local/bin/start-menu-core-prices-update.sh

そしてプログラムが正常に起動します。しかし、デーモンを起動すると:

$ sudo systemctl start menu-core-prices-update.service

次のエラーが発生します。

Jul 24 21:10:20 localhost systemd[13655]: menu-core-prices-update.service: Failed at step EXEC spawning /usr/local/bin/start-menu-core-prices-update.sh: Exec format error
-- Subject: Process /usr/local/bin/start-menu-core-prices-update.sh could not be executed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- The process /usr/local/bin/start-menu-core-prices-update.sh could not be executed and failed.
-- 
-- The error number returned by this process is 8.
Jul 24 21:10:20 localhost systemd[1]: menu-core-prices-update.service: Control process exited, code=exited status=203
Jul 24 21:10:20 localhost systemd[1]: Failed to start core-price-update daemon.
-- Subject: Unit menu-core-prices-update.service has failed

権限:

-rwxr-xr-x 1 root root 87 Jul 24 20:27 /usr/local/bin/start-menu-core-prices-update.sh

ベストアンサー1

質問1

次のタイトルの投稿が見つかりました。[解決済み] systemdにカスタムスクリプトを追加する上記の出力と同じエラーが表示されます。主に次のようになります。

EXEC フェーズで /usr/local/bin/start-menu-core-prices-update.sh の作成に失敗しました。 Exec形式エラー

このエラーは通常、スクリプトに次の問題の1つ以上があることを意味します。

  • 施行不可能
  • シャバン欠け( #!/bin/bash)

これらの問題を解決するには、スクリプトが実行可能であることを確認してください。

$ chmod a+x /usr/local/bin/start-menu-core-prices-update.sh

#!/bin/bashそして上のshebangを加えなさい。

質問#2

この行にタイプミスがあるようです。

After network.target = auditd.service

これはおそらく次のようになります。

After=network.target auditd.service

質問#3

を使用する理由は明確ではありませんType = forking。このタイプを使用するときは、ExecStart=というメソッドを使用する必要がありますfork()。このPIDFile=オプションも使用する必要があります。

あなたのJavaアプリケーションがsimpleまたはoneshot。次のタイトルのU&L Q&Aをご覧ください。システムスクリプトから分岐これについて詳しく学んでください。

おすすめ記事