シャットダウン直前にsystemdでスクリプトを実行する方法は?


58

[install]systemdが/home/me/so.plシャットダウンの直前および/proc/self/net/dev破壊される前に実行されるように、セクションに何を入れる必要がありますか?

[Unit]
Description=Log Traffic

[Service]
ExecStart=/home/me/so.pl

[Install]
?

回答:


66

推奨される解決策は、サービスユニットを通常のサービスとして実行すること[Install]です。セクションをご覧ください。そのため、依存関係もすべて逆に考える必要があります。シャットダウン順序は逆のスタートアップ順序であるためです。そのため、スクリプトをに配置する必要がありExecStop=ます。

次の解決策は私のために働いています:

[Unit]
Description=...

[Service]
Type=oneshot
RemainAfterExit=true
ExecStop=<your script/program>

[Install]
WantedBy=multi-user.target

RemainAfterExit=trueExecStartアクションがない場合に必要です。

ファイルを作成した後、とを確認しsystemctl daemon-reloadてくださいsystemctl enable yourservice --now

システム化されたIRCから得たばかりで、クレジットはmezcaleroに送られます。


6
ubuntu 16.04では、が必要ExecStart=/bin/trueです。
ニールス16

3
私の仮定WHY RemainAfterExit=trueなしがある場合に必要とされExecStartているためであるsystemd実行しようとしませんExecStop、それはサービスが実行されていないと考えている場合。RemainAfterExit=true原因とsystemdすると考えているサービスは、それによって実行させ、実行されていることをExecStopシャットダウン時に。
フェリペアルバレス

1
とにかく、ユーザーセッションとユーザープロセスが終了する前に、このスクリプトが実行されて完了することを保証する方法はありますか?
-richmb

@richmbまったくありません。ドキュメントから:Note that it is usually not sufficient to specify a command for this setting that only asks the service to terminate (for example, by queuing some form of termination signal for it), but does not wait for it to do so.
svenwltr

私はこれとさまざまな繰り返しを試しましたが、Debian Stretchでは機能しません。
2rs2ts

8

私が見る限り、これは私が必要とすることを行います(しかし、正確な理由はわかりません)。

[Unit]
Description=Log Traffic
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target


[Service]
ExecStart=/usr/local/bin/perl /home/me/log_traffic.pl --stop
Type=oneshot

3
1)DefaultDependencies = noは、すべての依存関係を無視し、開始時に「最初に」、停止時に「最後に」実行し、常に「前」および「後」節を尊重します。2)shutdown / reboot / haltターゲットにBefore句があるので、shutdown / reboot / haltが停止時に到達する直前に実行されます(停止時にのみ実行されるため、必要なことを実行します)。
RDP

kexec.targetBeforeビットに追加したい場合があります
-hanetzer

これは私のために動作しません
バグキラー

セクションに追加WantedBy=shutdown.target reboot.target halt.targetしない限り、これがどのように機能するかわかりません[Unit]Before=After=依存関係を変更しないでください。
rsaw

1
@FelipeAlvarez:コメントを削除しました。
sid_com

7
  • reboot / shutdown / halt / kexecサービスを開始する直前(つまり、ルートファイルシステムが読み取り専用に再マウントされる直前)にサービスを実行するには、次のサービス構成を使用します。

    [Unit]
    Description=Save system clock on shutdown
    DefaultDependencies=no
    After=final.target
    
    [Service]
    Type=oneshot
    ExecStart=/usr/lib/systemd/scripts/fake-hwclock.sh save
    
    [Install]
    WantedBy=final.target
    

    次で有効にします:

    systemctl enable my_service.service
    
  • 実際の再起動/シャットダウン/停止/ kexecの直前にスクリプトを実行するには(読み取り専用で再マウントされたためにルートファイルシステムに書き込むことができない場合)、このスクリプト実行可能ファイルを/usr/lib/systemd/system-shutdownディレクトリに追加します。

    実際のシステムを実行する直前に、halt / poweroff / reboot / kexec systemd-shutdownは/ usr / lib / systemd / system-shutdown /内のすべての実行可能ファイルを実行し、「halt」、「poweroff」、「reboot」のいずれかの引数を渡します選択したアクションに応じて、「」または「kexec」。このディレクトリ内のすべての実行可能ファイルは並行して実行され、すべての実行可能ファイルが終了するまでアクションの実行は継続されません。

参照:

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

https://www.freedesktop.org/software/systemd/man/systemd-halt.service.html


1
私は、再起動を開始した後、できるだけ前に何かを実行したいですfinal.target。理想的には、ユーザーが実行した後に最初に実行されることです$ sudo reboot
ハイメハブルツェル

5

はっきりとはわかりませんが、明示的に追加しましたが、インストール部分は必要ないと思います。私もそれをテストしませんでしたが、あなたが始めるのに役立つはずだと思います:

[Unit]
Description=Log Traffic
Requires=network.target
After=network.target
Before=shutdown.target
DefaultDependencies=no

[Service]
ExecStart=/home/me/so.pl
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=shutdown.target

これを試すと、スクリプトは起動(ブート)後すぐに実行されます。
sid_com

@sid_com thread.gmane.org/gmane.comp.sysutils.systemd.devel/4515/を読んだ後 DefaultDependencies = noを追加して、インストールセクションを削除してください。それ以外の場合は、after / requires行をリモートにすると役立つことがあります。
ウルリッヒダンゲル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.