次回の起動時にsystemdサービスデバイスを実行しますが、後続の起動では実行しません

次回の起動時にsystemdサービスデバイスを実行しますが、後続の起動では実行しません

次に、システムを起動するときに実行したいのですが、後続の起動では実行したくないスクリプトがあります。 systemdを使用して起動したかったので、次の場所にサービスファイルを作成しました/usr/lib/systemd/system/myscript.service

[Unit]
Description=My script.

[Service]
Type=oneshot
ExecStart=/opt/mypackage/bin/myscript

[Install]
WantedBy=multi-user.target

systemdにsystemctl enable myscript.service

後続の実行時に実行を停止するにはどうすればよいですか?

systemctl disable myscript.serviceスクリプトの最後に追加できますが、これは常にサービスを無効にします。可能であれば、サービスを有効にして起動してから、次回の起動時に引き続き実行したいと思います。

答え1

このConditionPathExists=ディレクティブ(参照systemd.unit(5))を使用して、条件付きでデバイスを起動できます。これにより、デバイスを永久に有効にし、単純なファイルを削除して(一時的に)無効にすることができます。

systemctl startsystemdでは、「起動時の開始」と「起動」の間に違いはありません。回避策は、スクリプトで稼働時間を確認して、次の起動時にデバイスを有効/無効にするかどうかを判断できるようにすることです(ファイルの削除/作成ConditionPathExists=)。

答え2

注: この回答は拡張されます。回答渡すティモシーラベル (ティモシーSiosmという名前は以前もこのサイトで使用されました。代替ソリューションを含みます。最初の部分に同意したら、Timothéeの答えに投票してください。

そしてティモシーラベルの回答ConditionPathExists=ユニットサービスファイルのセクションで使用されます(systemd.unit(5)を参照)[Unit]freedesktop.orgからまたはman7.orgから)サービスが条件付きで実行されるようにします。

たとえば、myscriptファイルまたはフォルダを一度作成することがユーザーの責任である場合は、次のことを反映する開始条件を追加しますConditionPathExists=!/path/to/folder。参考にしてください!、これは条件の意味を否定(反転)します。パスが存在しない場合にのみサービスユニットが開始されます。

代わりに、スクリプトが正常に実行された後に削除する必要があるファイルなどのファイルをConditionPathExists指すことがあります。/var/tmp/myscript.on-next-reboot単位ディレクティブで削除を追加することもできますExecStartPost=


ただし、通常、再起動後に作業が不要になるように、システムが正常に動作するように努力する必要があります。次回の起動時に実行するように設定する方法は非常に「Windowsに似ています」。 Linuxユーザーと管理者は、決定的、モジュラー、予測可能なブートを好みます。条件付きランタイム値が異なるブートパスをトリガすると、ブートシステムを推論することがより困難であり、破損しやすい。

関連情報