私はラジオマネージャサービスである最初のシステムサービスを作成しました。使い捨てで、システムの起動と終了時に実行するように設計されています。 Wi-Fiおよび/またはBluetoothをブロックまたはブロック解除するためにrfkillを呼び出すため、NetworkManagerによって異なります。必ずシステムサービスにしない限り、ユーザーサービスとして維持したいと思います。
また、ユーザー pi が loginctl と一致するようにシステムを設定しました。
私の問題は、シャットダウン時にサービスが呼び出されますが、Wi-FiとBluetoothラジオが期待どおりにブロックされないことです。どんな提案にも感謝します。ありがとうございます! ! ! ! !
これは私のサービスファイルです。
[Unit]
Description=RAL Radio Manager BT and Wifi Service
After=network.target
[Service]
Type=oneshot
WorkingDirectory=/home/pi/RAL/radio-manager
Environment=PYTHONUNBUFFERED=1
ExecStart=/usr/bin/python3 /home/pi/RAL/radio-manager/radio_manager.py -bs=1
ExecStop=/usr/bin/python3 /home/pi/RAL/radio-manager/radio_manager.py -bs=0
RemainAfterExit=yes
Restart=no
[Install]
#WantedBy=multi-user.target
WantedBy=default.target
これは私のPythonスクリプトです
def radio_manager(args):
MAGNET_OR_SWITCH_GPIO = 4
PROGRAM_EXIT_GPIO = 22
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM ) # .BCM refs the GPIO by the GPIO#, .BOARD by Pin number
GPIO.setup( MAGNET_OR_SWITCH_GPIO, GPIO.IN, pull_up_down=GPIO.PUD_UP) # RPi Header Pin 7, GPIO4, reads the onboard swx state S2.
GPIO.setup(PROGRAM_EXIT_GPIO, GPIO.IN, pull_up_down=GPIO.PUD_DOWN )
#radio_list = rfkill.rfkill_list()
if (args.boot_state == 0):
#Power Down
rfkill.rfkill_blockby('wlan')
print ("Blocking WIFI!!!!!")
rfkill.rfkill_blockby('bluetooth')
print ("Blocking Bluetooth!!!!!")
elif(args.boot_state == 1):
#Power Up
program_exit_pin = GPIO.input(PROGRAM_EXIT_GPIO)
user_requests_wifi = os.path.exists(WIFI_ON_FILE_PATH)
if (program_exit_pin or user_requests_wifi):
rfkill.rfkill_unblockby('wlan')
print ("UnBlocking WIFI!!!!!")
magnet_pin = GPIO.input(MAGNET_OR_SWITCH_GPIO)
if(magnet_pin == 0):
rfkill.rfkill_unblockby('bluetooth')
print ("UnBlocking Bluetooth!!!!!")
return
def main(argv):
args=cli(argv)
radio_manager(args)
return 0
if __name__ == '__main__':
sys.exit(main(sys.argv))
編集:まずサービスを再度有効にして開始しました。 22:17:42以降のタイムスタンプを確認してください。
pi@raspberrypi:~$ systemctl --user enable radio_manager.service
Created symlink /home/pi/.config/systemd/user/default.target.wants/radio_manager.service â /home/pi/.config/systemd/user/radio_manager.service.
pi@raspberrypi:~$ systemctl --user start radio_manager.service
pi@raspberrypi:~$ journalctl --user-unit radio_manager.service
-- Logs begin at Thu 2020-08-20 20:04:47 BST, end at Thu 2020-08-20 22:17:43 BST
Aug 20 20:05:14 raspberrypi systemd[370]: Starting RAL Radio Manager BT and Wifi
Aug 20 20:05:16 raspberrypi systemd[370]: Started RAL Radio Manager BT and Wifi
Aug 20 21:42:49 raspberrypi systemd[370]: Stopping RAL Radio Manager BT and Wifi
Aug 20 21:42:51 raspberrypi python3[650]: Blocking WIFI!!!!!
Aug 20 21:42:51 raspberrypi python3[650]: Blocking Bluetooth!!!!!
Aug 20 21:42:51 raspberrypi systemd[370]: radio_manager.service: Succeeded.
Aug 20 21:42:51 raspberrypi systemd[370]: Stopped RAL Radio Manager BT and Wifi
Aug 20 22:17:42 raspberrypi systemd[370]: Starting RAL Radio Manager BT and Wifi
Aug 20 22:17:43 raspberrypi systemd[370]: Started RAL Radio Manager BT and Wifi
rfkill は、両方のインターフェイスが期待どおりにブロック解除されたことを示します。 sudoの終了と開始後
pi@raspberrypi:~$ journalctl --user-unit radio_manager
-- Logs begin at Thu 2020-08-20 22:22:23 BST, end at Thu 2020-08-20 22:25:04 BST
Aug 20 22:22:51 raspberrypi systemd[359]: Starting RAL Radio Manager BT and Wifi
Aug 20 22:22:53 raspberrypi systemd[359]: Started RAL Radio Manager BT and Wifi
lines 1-3/3 (END)
pi@raspberrypi:~$
pi@raspberrypi:~$ rfkill list
0: phy0: Wireless LAN
Soft blocked: no
Hard blocked: no
1: hci0: Bluetooth
Soft blocked: no
Hard blocked: no
pi@raspberrypi:~$
編集:永続システムログをオンにしましたが、シャットダウン時に私のサービスが呼び出されることがわかりますが、おそらくrfkillが終了したか、コマンドの受信を停止した後です。キーと一緒に終了時に切り捨てられたシステムログを添付しました。
Aug 21 16:18:23 raspberrypi sshd[522]: pam_unix(sshd:session): session opened fo
Aug 21 16:18:23 raspberrypi systemd-logind[253]: New session c1 of user pi.
Aug 21 16:18:23 raspberrypi systemd[1]: Started Session c1 of user pi.
Aug 21 16:18:30 raspberrypi systemd[1]: systemd-hostnamed.service: Succeeded.
Aug 21 16:23:20 raspberrypi sudo[560]: pi : TTY=pts/0 ; PWD=/home/pi ; USE <----------- Sudo shutdown now issued
Aug 21 16:23:20 raspberrypi sudo[560]: pam_unix(sudo:session): session opened fo
Aug 21 16:23:21 raspberrypi sudo[560]: pam_unix(sudo:session): session closed fo
Aug 21 16:23:21 raspberrypi systemd[1]: Unmounting RPC Pipe File System...
Aug 21 16:23:21 raspberrypi sshd[522]: pam_unix(sshd:session): session closed fo
Aug 21 16:23:21 raspberrypi sshd[522]: pam_systemd(sshd:session): Failed to rele
Aug 21 16:23:21 raspberrypi systemd[1]: Stopping Session c1 of user pi.
Aug 21 16:23:21 raspberrypi systemd[1]: systemd-rfkill.socket: Succeeded. <------------ Is this the service I need to set the radio status using rfkill
Aug 21 16:23:21 raspberrypi systemd[1]: Closed Load/Save RF Kill Switch Status /
Aug 21 16:23:21 raspberrypi systemd[1]: Stopped target Bluetooth.
Aug 21 16:23:21 raspberrypi systemd[364]: run-rpc_pipefs.mount: Succeeded.
Aug 21 16:23:21 raspberrypi systemd[1]: Stopping Authorization Manager...
Aug 21 16:23:23 raspberrypi systemd[1]: Stopping Manage Sound Card State (restor
Aug 21 16:23:23 raspberrypi systemd[364]: Stopping RAL Radio Manager BT and Wifi <------ SystemD executing ExecStop for my service
Aug 21 16:23:23 raspberrypi systemd[1]: Removed slice system-getty.slice.
Aug 21 16:23:23 raspberrypi systemd[1]: rc-local.service: Succeeded.
Aug 21 16:23:23 raspberrypi systemd[1]: Stopped /etc/rc.local Compatibility.
Aug 21 16:23:23 raspberrypi alsactl[290]: alsactl daemon stopped
Aug 21 16:23:23 raspberrypi systemd[1]: systemd-logind.service: Succeeded.
Aug 21 16:23:23 raspberrypi systemd[1]: Stopped Login Service.
Aug 21 16:23:23 raspberrypi systemd[1]: raspi-config.service: Succeeded.
Aug 21 16:23:23 raspberrypi systemd[1]: Stopped LSB: Switch to ondemand cpu gove
Aug 21 16:23:23 raspberrypi systemd[1]: alsa-state.service: Succeeded.
Aug 21 16:23:23 raspberrypi systemd[1]: Stopped Manage Sound Card State (restore
Aug 21 16:23:24 raspberrypi systemd[1]: hciuart.service: Succeeded.
Aug 21 16:23:24 raspberrypi systemd[1]: Stopped Configure Bluetooth Modems conne
Aug 21 16:23:24 raspberrypi wpa_supplicant[282]: wlan0: CTRL-EVENT-DISCONNECTED
Aug 21 16:23:24 raspberrypi wpa_supplicant[282]: dbus: wpa_dbus_property_changed
Aug 21 16:23:24 raspberrypi dhclient[398]: receive_packet failed on wlan0: Netwo
Aug 21 16:23:25 raspberrypi python3[591]: Blocking WIFI!!!!! <------ My service is trying to Softblock WIFI
Aug 21 16:23:25 raspberrypi python3[591]: Blocking Bluetooth!!!!! <------ My service is trying to Softblock Bluetooth
Aug 21 16:23:24 raspberrypi wpa_supplicant[282]: wlan0: CTRL-EVENT-REGDOM-CHANGE
Aug 21 16:23:25 raspberrypi wpa_supplicant[282]: rfkill: WLAN soft blocked
Aug 21 16:23:25 raspberrypi wpa_supplicant[282]: rfkill: WLAN soft blocked
Aug 21 16:23:25 raspberrypi wpa_supplicant[282]: nl80211: Failed to open /proc/s
Aug 21 16:23:25 raspberrypi wpa_supplicant[282]: nl80211: Failed to set IPv4 uni
Aug 21 16:23:25 raspberrypi NetworkManager[269]: <info> [1598023405.1102] manag
Aug 21 16:23:25 raspberrypi NetworkManager[269]: <info> [1598023405.1197] devic
Aug 21 16:23:25 raspberrypi NetworkManager[269]: <info> [1598023405.1415] dhcp4
Aug 21 16:23:25 raspberrypi NetworkManager[269]: <info> [1598023405.1441] dhcp4
Aug 21 16:23:25 raspberrypi NetworkManager[269]: <info> [1598023405.2310] dns-m
Aug 21 16:23:25 raspberrypi systemd[364]: radio_manager.service: Succeeded.
Aug 21 16:23:25 raspberrypi systemd[364]: Stopped RAL Radio Manager BT and Wifi <------ Systemd stopped by service
Aug 21 16:23:25 raspberrypi systemd[364]: Stopped target Basic System.
Aug 21 16:23:25 raspberrypi systemd[364]: Stopped target Timers.
Aug 21 16:23:25 raspberrypi systemd[364]: Stopped target Sockets.
答え1
以降 = network.target
ユーザー単位はシステム単位に依存できません。これには「順序依存」が含まれます。たとえば、After=
network.target はシステム単位です。したがって、この行は何もしません。
一方、ユーザーユニットはシステムユニット内で実行されます[email protected]
。このデバイスは、After = network.targetの後に(間接的に)注文されました。
いっぱい詰まった状態では、polkit.service
終了後直ちに終了し、再活性化ができない可能性があると思います。たぶんこれがあなたの問題かもしれません。 polkitは、ログインしたユーザーがrfkillを操作できるようにするなどの権限を付与するために使用されます。