起動中にジョブを自動化するためにddコマンドを使用しますが、起動後に呼び出すとサービスは常に失敗しますか?

起動中にジョブを自動化するためにddコマンドを使用しますが、起動後に呼び出すとサービスは常に失敗しますか?

さて、私はいくつかの組み込みsbcに他のLinuxイメージをフラッシュしてインストールするプロセスを自動化したいと思います。私は現在pxeイメージを使って組み込みデバイスを起動しています。通常、pxeイメージが起動するのを待ってから、pxeサーバー上のイメージを使用してnfsを介してオンボードハードドライブをフラッシュするddコマンドを実行します。したがって、この部分はうまく機能しますが、スタートアップサービスとして実行しようとすると失敗します。運が良かったので一度働きましたが、おかしくて一種のタイムアウトや競争条件があると思うようになりました。だから運が良かったし、同じ設定で再び動作しませんでした。私はrc-local.serviceと私の実際のシステムサービスを通してそれを処理します。私のスクリプトとサービスファイルは次のとおりです。また、これを有効にしてmulti-user.targetの下にリンクがあることを確認しました。

#script at /usr/local/sbin/sysInstall
----------------------------------------------------------------------------
#!/bin/bash

dd if=/mnt/nfs/RTE.img of=/dev/sda status=progress &>> /mnt/nfs/dd_out.txt

shutdown -r now
----------------------------------------------------------------------------

#service file at /etc/systemd/system/sysInstall.service
[Unit]
Description=Load the image onto the harddrive from nfs

[Service]
ExecStart=/usr/local/sbin/sysInstall

[Install]
WantedBy=multi-user.target



はい、/usr/local/sbinのファイルスクリプトをchmod +xしましたが、何も変更されませんでした。また、sciptを/ binに入れて起動後に実行することができ、正常に実行されるため、スクリプト自体は問題ないようですが、サービスは常に失敗します。

[root@station1 ~]# systemctl -l status sysInstall.service
● sysInstall.service - This service auto flashes the local harddrive
   Loaded: loaded (/etc/systemd/system/sysInstall.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Thu 2018-10-04 20:37:35 CDT; 34s ago
  Process: 3573 ExecStart=/usr/local/sbin/sysINSTALL.sh (code=exited, status=1/FAILURE)
 Main PID: 3573 (code=exited, status=1/FAILURE)

Oct 04 20:37:35 station1 systemd[1]: Started This service auto flashes the local harddrive.
Oct 04 20:37:35 station1 systemd[1]: Starting This service auto flashes the local harddrive...
Oct 04 20:37:35 station1 systemd[1]: sysInstall.service: main process exited, code=exited, status=1/FAILURE
Oct 04 20:37:35 station1 systemd[1]: Unit sysInstall.service entered failed state.
Oct 04 20:37:35 station1 systemd[1]: sysInstall.service failed.

最後に興味深いのは、システムがこのスクリプトを使用して再起動するため、そのスクリプトに入りますが、ddが失敗して再起動にジャンプすることです。いいえ、私にはbashが順番に進んでいるので、ddが失敗した場合はなぜ続行しますか?だから問題を診断し、上記の結果を得るために再起動をコメントアウトしました。誰もが私が何を間違っているか、試してみるべきことを指摘することができれば良いでしょう。ありがとうございます。

提案されているようにサービスファイルを編集し、それを出力として取得しました。また、ブートログイン前のように、ブートの終わりにnfs /mnt/nfsがマウントされることを確認しました。したがって、デバイスがその条件を真として受け取り、起動するのを待つ必要がありますか?

[root@station1 ~]# systemctl -l status sysInstall.service
● sysInstall.service - This service auto flashes the local harddrive
   Loaded: loaded (/etc/systemd/system/sysInstall.service; enabled; vendor preset: disabled)
   Active: inactive (dead)
Condition: start condition failed at Thu 2018-10-04 20:18:32 CDT; 5min ago
           ConditionPathIsMountPoint=/mnt/nfs was not met

Oct 04 20:18:32 station1 systemd[1]: Started This service auto flashes the local harddrive.

条件を繰り返し試すための回避策として、OnBootSec =を使用するためにシステムタイマーを調査しています。

関連情報