自分メモ:プログラム自動起動方法:systemdを用いた方法

Linux系のディストリビューションでは、かつて/etc/init.d/を用いた、プログラムやサービスの自動起動方法がありました。

最新ではsystemdを用いた方法がスマートなので、試してみました。

1. service ファイルを作成(sample.shを実行する場合)

sudo vi /etc/systemd/system/sample.service

[Unit]
Description=sample.service

[Service]
ExecStart=/usr/local/bin/sample.sh
TimeoutStopSec=15

[Install]
WantedBy=multi-user.target


2. serviceファイルをenable & 起動

sudo systemctl enable sample
sudo systemctl start sample


# ステータスの確認
sudo systemctl status sample
● modesmixser2.service - sample
   Loaded: loaded (/etc/systemd/system/sample.service; enabled; vendor preset: enabl
   Active: active (running) since Tue 2021-02-16 11:15:08 JST; 1min 28s ago
 Main PID: 7138 (start_modes.sh)
    Tasks: 5 (limit: 2063)
   CGroup: /system.slice/sample.service
           ├─7138 /bin/sh /usr/local/bin/sample.sh
           └─7139 /usr/local/bin/sample --inConnect 192.168.11.170:30334 --inConn

Feb 16 11:15:09 raspberrypi sample.sh[7138]: 2021-02-16 11:15:09.436  INFO     inConn
Feb 16 11:15:09 raspberrypi sample.sh[7138]: 2021-02-16 11:15:09.437  INFO     inConn


# 稼働しているすべてのサービスを表示
systemctl list-units --type=service

UNIT                               LOAD   ACTIVE SUB     DESCRIPTION
alsa-restore.service               loaded active exited  Save/Restore Sound Card State
alsa-state.service                 loaded active running Manage Sound Card State (restore
avahi-daemon.service               loaded active running Avahi mDNS/DNS-SD Stack
console-setup.service              loaded active exited  Set console font and keymap
cron.service                       loaded active running Regular background program proce
dbus.service                       loaded active running D-Bus System Message Bus
dhcpcd.service                     loaded active running dhcpcd on all interfaces
dumpvdl2.service                   loaded active running VDL Mode 2 decoder
fake-hwclock.service               loaded active exited  Restore / save the current clock
getty@tty1.service                 loaded active running Getty on tty1
ifupdown-pre.service               loaded active exited  Helper to synchronize boot up fo
keyboard-setup.service             loaded active exited  Set the console keyboard layout
kmod-static-nodes.service          loaded active exited  Create list of required static d
modesmixser2.service               loaded active running modesmixer2
networking.service                 loaded active exited  Raise network interfaces
pm2-root.service                   loaded active running PM2 process manager
raspi-config.service               loaded active exited  LSB: Switch to ondemand cpu gove
rc-local.service                   loaded active exited  /etc/rc.local Compatibility
rng-tools.service                  loaded active running rng-tools.service
rpi-eeprom-update.service          loaded active exited  Check for Raspberry Pi EEPROM up
rsyslog.service                    loaded active running System Logging Service
serial-getty@ttyAMA0.service       loaded active running Serial Getty on ttyAMA0
ssh.service                        loaded active running OpenBSD Secure Shell server

ハマったところ

当初引数が多いプログラムを起動しようとしたところ。”Too many arguments.”というエラーが出て、正常に起動しませんでした。

対処策としてshスクリプトにて引数を指定し、serviceファイルを作成したところ、正常に動作しました。

引数が多い場合には、別途環境ファイル(EnvironmentFile)を設定する方法があります。

以下参考:

cat /etc/systemd/system/dumpvdl2.service

[Unit]
Description=VDL Mode 2 decoder
Documentation=https://github.com/szpajder/dumpvdl2/blob/master/README.md
Wants=network.target
After=network.target

[Service]
Type=simple
EnvironmentFile=/etc/default/dumpvdl2
# If you don't want to run the program as root, then uncomment
# the following line and put a desired user name in it.
# Note that the user must have access to the SDR device.
#User=someuser
ExecStart=/usr/local/bin/dumpvdl2 $DUMPVDL2_OPTIONS
Restart=no

[Install]
WantedBy=multi-user.target


cat /etc/default/dumpvdl2

# This file is used by the dumpvdl2 systemd unit.
# - Copy it to /etc/default/dumpvdl2
# - Uncomment the following line and set your preferred command line options.
# DUMPVDL2_OPTIONS="--rtlsdr 0 --gain 39 --correction 0 --output decoded:text:file:path=/home/pi/vdl2.log,rotate=daily 136975000 136875000 136775000"
DUMPVDL2_OPTIONS="--msg-filter all,-acars_nodata --rtlsdr 0 --gain 49.6 --correction 42 --output decoded:text:file:path=/tmp/video/dump-vdl/dumpvdl2.log,rotate=daily --bs-db /tmp/video/dump-vdl/BaseStation.sqb"

ともあれ、今風の自動起動の方法を学習できました。

参考にさせていただきました。ありがとうございます。

ラズパイのプログラムを、起動時や定刻に自動実行したい。 cronとかもあるが比較的新しくてイケてるらしいので、systemdとやらを使ってみようと思う。 脱コピペの思いで唸りながら理解したので、同じく脱コピペしたい初心者の同志に向け...
systemdによる自動起動について調べた時の備忘録。

追記:Boot後に一定時間をおいて起動させる方法。

自宅の環境では起動後にNASのフォルダーをマウントし、データファイルをNASに作成するのですが、上記の方法ではNASマウント前に実行され、プログラムが正常に起動しない場合がありました。

起動時に一定の時間をおいて、往路ぐらむを起動する方法です。

ポイント:タイマーファイルを作る

/etc/systemd/system/プログラム名.timer

vi /etc/systemd/system/dumpvdl2.timer

[Unit]
Description=Runs dumpvdl2

[Timer]
# ブート後、この時間後にこのタイマーを開始する
OnBootSec=3min
# 繰り返し実行する時間の間隔
# OnUnitActiveSec=10s

# 対象のサービス
Unit=dumpvdl2.service

[Install]
WantedBy=multi-user.target

タイマーの有効化

sudo systemctl start dumpvdl2.timer
sudo systemctl enable dumpvdl2.timer

sudo systemctl status dumpvdl2.timer
● dumpvdl2.timer - Runs dumpvdl2 2021/02/28
   Loaded: loaded (/etc/systemd/system/dumpvdl2.timer; enabled; vendor preset: e
   Active: active (running) since Sun 2021-02-28 07:17:54 JST; 34s ago
  Trigger: n/a

Feb 28 07:17:54 raspberrypi systemd[1]: Started Runs dumpvdl2 2021/02/28.

参考にさせていただきました。ありがとうございます。

実行するスクリプトを用意する /usr/local/bin/myscript #!/bin/sh date >> /tmp/myscript.txt 実行権限を忘れずに chmod 755 /usr/loc...

シェアする

  • このエントリーをはてなブックマークに追加

フォローする