電源が切れたときに無線ネットワークが必要なスクリプトの実行

電源が切れたときに無線ネットワークが必要なスクリプトの実行

終了時に、あるLinuxボックスから別のLinuxボックスにディレクトリを同期するスクリプトを実行しようとしています。私はそれがうまくいくと思いましたが、すべてのテストは有線接続を介して接続されたボックスで行われました。

ノートパソコンで試してみて失敗しました。 IPステータスをファイルに反映するデバッグスクリプトを作成し、サービスで実行しましたが、キャリアはワイヤレスインターフェイスから削除されていますが、有線インターフェイスでは削除されないため、問題なく有線で動作することがわかりました。 Wi-Fi経由で失敗します。

ワイヤレスで動作したいです。これが私がラップトップで使用する設定であり、有線および無線インターフェースが構成されています。

私はprepowoffサービスが起動時に遅く実行されることを確認するためにsystemd-analyzeグラフを使用しました。したがって、私が読んだところによると、シャットダウンはシャットダウンシーケンスの最初に起こるはずです。

ファイルとデバッグ情報は次のとおりです。

prepowoff.service(/etc/systemd/system)

[Unit]

After=multi-user.target
Before=shutdown.service reboot.service halt.service

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/root/bin/debug

[Install]
WantedBy=multi-user.target

デバッグスクリプト(/root/binにあります)

#!/bin/bash
DATE=$(/bin/date +"%D - %T - %N")
WLAN0_STATE=$(/sbin/ip a show wlan0)
ETH0_STATE=$(/sbin/ip a show eth0)
LOGFILE=/root/bin/log.txt
SLEEP=/bin/sleep
echo "++++++  START  ++++++" > ${LOGFILE}
echo ${DATE} >> ${LOGFILE}
echo "--------------------" >> ${LOGFILE}
echo ${ETH0_STATE} >> ${LOGFILE}
echo "--------------------" >> ${LOGFILE}
echo ${WLAN0_STATE} >> ${LOGFILE}
echo "+++++  END  ++++++++" >> ${LOGFILE}

デバッグスクリプトの出力です。起動後に実行すると、IP情報は削除されますが、ステータスを表示できます。

++++++  START  ++++++
01/16/16 - 16:50:47 - 145920573
--------------------
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP
--------------------
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP
+++++  END  ++++++++

以下は、再起動後に有線インターフェイスがオンになり、ワイヤレスインターフェイスがオフになっていることを示す出力です。

++++++  START  ++++++
01/16/16 - 16:51:10 - 424001117
--------------------
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP
--------------------
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN
+++++  END  ++++++++

NetworkManager-wait-online.serviceを有効にして続行するなど、さまざまな方法を試しましたが、サービスを有効にするだけでエラーが発生し始めました。理論的には、prepowoffサービスの終了が他のものよりも先に発生する必要があるため、携帯通信会社がWi-Fiを使用している理由を理解できません。

どんな助けでも大変感謝します。

ありがとうございます。

答え1

このサービスファイルを使用して作業できました。

[Unit]
After=wpa_supplicant.service dbus.service NetworkManager.service
Requires=wpa_supplicant.service dbus.service NetworkManager.service

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/true
ExecStop=/root/bin/prepowoff

[Install]
WantedBy=multi-user.target

ネットワーク管理者が引き続き実行していても、wpa 申請者と dbus はまだワイヤレスカードを終了します。

関連情報