boot時の自動実行 - HondaLab/Robot-Intelligence GitHub Wiki

DebianPCやラズパイのboot時に,特定の処理を自動的に実行したい場合が あります. たとえば,wifiへの接続など.

/etc/rc.localで

古いやり方ですが,もっとも簡単な方法は,/etc/rc.localに必要な処理を記述する方法です. ただし,stretch以降はインストール直後は,無効になっていて,使えません. systemctlを使って,rc-local serviceを有効にする必要があります.

/etc/rc.localにboot時に行いたい処理を書き込みます. その後,

# chmod u+x /etc/rc.local
# systemctl start rc-local

ファイル名はrc.localですが,systemctlのservice名はrc-local なので注意が必要です.

systemdのつかいかた

Debian stretch以降は起動プロセスをsystemdで扱うようになりました. 設定は /etc/systemd/system, /lib/systemd/systemの中のserviceファイルに書かれています.

サービスリストを得る

# systemctl list-units --type=service

wpa_supplicant.serviceを止めてみる

sudo systemctl stop wpa_supplicant.service
sudo systemctl mask wpa_supplicant.service

2行目のmaskオプションを実行すると,以降の起動で自動実行されなくなる.

wps.serviceを自作してみる

概略

  • /opt/wpa.shを用意
  • /etc/systemd/system/wpa.service を用意
  • 既存のwpa_supplicant.serviceを止める
  • 新しい wpa.service を start, enable

/etc/systemd/syste/wpa.service ファイル

[Unit]
Description=wpa_supplicant for local network
After=network.target auditd.service
ConditionPathExists=/opt # スクリプトを置くディレクトリ

[Service]
Type=oneshot
ExecStart=/opt/wpa.sh # 実行するスクリプト
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

必須なのは,4行目のConditionPathExists と 7行目の ExecStart 2行目のDescriptionは任意.

/opt/wpa.sh ファイル

#!/bin/sh
intf=wlx4494fc1102ab
addr=172.16.1.142
/sbin/ifconfig $intf $addr
sleep 1
/usr/bin/pkill wpa_supplicant
sleep 1
/sbin/wpa_supplicant -i$intf -c/etc/wpa_supplicant/wpa_supplicant.conf &

一行目の #!/bin/sh は必要. 手動で実行するときは不要だが,systemdから実行する際には shellを指定する必要があるようだ.

既存のwps_supplicantが動いていると,うまく動作しないので, 念の為pkillしている.

もちろん,ディレクトリ,スクリプト共に,実行パーミッションが必要.

# chmod 744 /opt
# chmod 744 /opt/wpa.sh

start / enable

# systemctl start wpa.service
# systemctl enable wpa.service

status

# systemctl status wpa.service