これにはシャットダウン/再起動時にスクリプトを実行する多くのソリューションがありますが、私のスクリプトはシャットダウン時にのみ実行したいと思います。
スクリプトを/usr/lib/systemd/systemd-shutdownに入れて、示されているように$ 1パラメータを確認してみました。ここしかし、うまくいきません。
どんなアイデアがありますか?
システム: gnome-shell を含む Archlinux
$systemctl --version
systemd 229
+PAM -AUDIT -SELINUX -IMA -APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN
答え1
ついにこれを行う方法を見つけました。
少し古い時代のアイデアですが、効果があります。
私はこのスレッドの一部を使用しました:https://stackoverflow.com/questions/25166085/how-can-a-systemd-control-service-distinguish- Between-shutdown-and-reboot
そしてこのスレッドは: シャットダウンする前にsystemdを使用してスクリプトを実行する方法は?
このサービスを作成しました/etc/systemd/system/shutdown_screen.service
[Unit]
Description=runs only upon shutdown
Conflicts=reboot.target
After=network.target
[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/bin/bash /usr/local/bin/shutdown_screen
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
終了/再起動/停止/何でも実行されます。 (有効にすることを忘れないでください)
私のスクリプトに/usr/local/bin/shutdown_screen
以下を追加しました。
#!/bin/bash
# send a shutdown message only at shutdown (not at reboot)
/usr/bin/systemctl list-jobs | egrep -q 'reboot.target.*start' || echo "shutdown" | nc 192.168.0.180 4243 -w 1
これにより、画面が消える終了メッセージがArduinoに送信されます。
答え2
systemd.special
マニュアルページによるとBefore=poweroff.target
。
停電対象
A special target unit for shutting down and powering off the system. Applications wanting to power off the system should start this unit. runlevel0.target is an alias for this target unit, for compatibility with SysV.
また、コメントで述べたように、カスタムスクリプトをに入れる必要があります/etc/systemd/system/
。この/usr/lib/systemd/system/
ディレクトリはシステム提供のスクリプト用です。
おそらく次のようになります。
[Unit]
Description=runs only upon shutdown
DefaultDependencies=no
Conflicts=reboot.target
Before=shutdown.target
Requires=poweroff.target
[Service]
Type=oneshot
ExecStart=/bin/true
ExecStop=/usr/local/bin/yourscript
RemainAfterExit=yes
答え3
ここで答えを読んでみると、systemdの仕組みについて多くの誤解があるようです。まず、目標を取り除くために紛争を使用しないでください。競合するサービスを同時に実行することは避けるべきです。
あるユニットが別のユニットに衝突=を設定した場合、前者を起動すると後者は停止し、その逆の場合も同様です。
ユニットは、達成する目的ではなく特定のサービスを開始する.serviceファイルを参照します。つまり、Conflicts=reboot.target
せいぜい意味がなく、最悪の場合は再起動を防ぐことができます。これをしないでください。これは、再起動時に実行しないことを意味するものではありません。これは、時間とsystemdがクラッシュを使用してこのエラーを解釈する方法に応じて、このサービスを中断または再起動することを意味します。
以下は、現在のリブート時ではなくシャットダウン時にのみ実行されるようにデバイス(.serviceファイルとも呼ばれる)を設定する例です。
[Unit]
Description=Play sound
DefaultDependencies=no
Before=poweroff.target halt.target
[Service]
ExecStart=/usr/local/bin/playsound.sh
ExecStop=/usr/local/bin/playsound.sh
Type=oneshot
RemainAfterExit=yes
[Install]
WantedBy=poweroff.target halt.target
poweroff.targetは、終了時にのみ到達する以前のsystemv実行レベル0と同じです。 Halt.targetはsystemdによって使用される代替の終了パスであり、再起動を介してもアクセスできません。インストール部分はsystemdに、このサービスを以前に完了する必要があるpoweroff.target
か、halt.target
到達したと見なされたアイテムのリストに追加するように指示します。
サービスは私のシステムにインストールされ実行されています。
答え4
私はここと様々なサイトでほとんどの投稿をテストしました。実際には、再起動時にのみ実行される唯一のもの(ブート時には実行されませんが、実際にshutdown-halt-poweroff時に失敗する)は@benoit2600の投稿です。彼のセカンド/ソリューション投稿
しかし、テストの後、デバイスは4つのターゲットをすべて使用でき、そのうちの1つが実際に使用されている場合にのみ実行できることがわかりました。その人とあなたのニーズに合わせて休んでください。 「ExecStop = mycommand」に直接コマンドを入力しました(完全なbashは必要ありません)。
[Unit]
Conflicts=reboot.target poweroff.target halt.target shutdown.target