サービス

CentOS6 までは Linux 起動時の最初に動く "PID が 1 のプロセス"は init でしたが、 CentOS7 系からは systemd となっています。(systemctl コマンドは、"systemd" をコントロールするコマンドです。)
よって、Debian系、RedHat系ともに、systemctl コマンドを使うのが主流のようです)
サービス管理コマンドsystemctlを使います。
これは、/lib/systemdにある設定ファイルを指定して、コマンドを実行するもの

systemd サービス

vsftpd.serviceが動作中を確かめる例
pi@raspberrypi:~ $ systemctl is-active vsftpd.service
active
pi@raspberrypi:~ $
サービスは、Unit という単位のファイル(拡張子は.service)で管理され、以下はその例(network-select.service)です。
[Unit]
Description=Network mode selector based on DIP switch
DefaultDependencies=no
After=local-fs.target
Before=network.target dhcpcd.service hostapd.service dnsmasq.service

[Service]
Type=oneshot
ExecStart=/usr/bin/python3 /usr/local/bin/network-select.py
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

上記は、systemd のユニットファイルで、Linux起動時に特定のPythonスクリプト(network-select.py)を実行して、 DIPスイッチの状態に応じてネットワークモードを選択するサービスを定義しています。
なお、Unit内で実行するスクリプト(上記例:network-select.py)の中でprintのような出力は、 “journal(systemd のログ)” に記録されます。
これは、例えば『journalctl -u network-select.service』のように、journalctlコマンドで確認できる。

Unit という単位のサービスは、次のsystemctlコマンドで制御できます。

systemctl [OPTIONS...] COMMAND ${Unit}
操作コマンド
サービス起動 systemctl start ${Unit}
サービス停止 systemctl stop ${Unit}
サービス再起動systemctl restart ${Unit}
サービス・リロード systemctl reload ${Unit}
サービスステータス表示 systemctl status ${Unit}
サービス自動起動有効 systemctl enable ${Unit}
サービス自動起動無効 systemctl disable ${Unit}
サービス自動起動設定確認 systemctl is-enabled ${Unit}
サービス一覧 systemctl list-unit-files --type=service
設定ファイルの再読込 systemctl daemon-reload

systemd サービスに登録する場合の.serviceファイル(Unit)の作り方

systemdサービスユニットファイルの基本構造は、3つ([Unit]セクション、[Service]セクション、[Install]セクション)の主要なセクションで構成されます。
各セクションの内容は、次の表現を記述します。
  1. [Unit] セクション:サービスに関する一般的な情報と、他のユニットとの関係を定義します。
    Description= サービスの簡単な説明。
    Documentation= 関連するドキュメントのURLなど。
    Requires= 起動前に必ず起動している必要があるユニット。これが失敗するとこのユニットも失敗します。
    After= 起動順序を指定。このユニットは、指定したユニットの後に起動されます。
    Before= 起動順序を指定。このユニットは、指定したユニットの前に起動されます。
    Wants= 推奨される依存関係。このユニットが起動されるときに指定したユニットも起動されますが、指定したユニットが失敗してもこのユニットの起動には影響しません。

  2. [Service] セクション:サービスの実行方法の指定で、どのようなプログラムを実行するか、その権限などを定義します。
    ExecStart= サービスを起動するために実行するコマンド。有効化で必須の設定項目
    Type= サービスの起動タイプ。一般に以下の設定があります。推奨の設定項目
    simple: ExecStartで指定したプロセスがメインプロセスです。(最も一般的)
    forking: ExecStartが終了した後、子プロセスがバックグラウンドで実行され続けます。(古いデーモン形式)
    oneshot: コマンドを実行して終了したら、サービスも終了と見なされます。
    ExecStop= サービスを停止するために実行するコマンド。(オプション)
    ExecReload= サービスを再読み込みするために実行するコマンド。(オプション)
    Restart= サービスが予期せず終了した場合の再起動関連の指定で、always, on-failure, no などを記述。
    User= サービスを実行するユーザー名を記述するが、セキュリティ上、root以外を推奨します。
    Group= サービスを実行するグループ名を記述するが、セキュリティ上、root以外を推奨します。
    WorkingDirectory= サービスが実行される作業ディレクトリ。
    RemainAfterExit= サービスが終了しても「アクティブな状態」として systemd に残るようにする場合にyesを指定します。
    特に Type=oneshot のユニットと組み合わせて使われることが多いです。
    Type=oneshot のサービスはコマンドを一度実行してすぐ終了します。 終了すると systemd はそのサービスを「inactive(停止)」とみなします。 これを「このサービスは一度実行すれば完了したとみなして、アクティブ扱いにしておきたい」という場合に指定します。

  3. [Install] セクション:システム起動時にサービスを自動起動(有効化/enable)する方法を定義します。
    WantedBy= サービスが有効化されるときに、どのターゲット(実行レベルのようなもの)に組み込まれるかを指定。
    multi-user.target が一般的です。(通常のサーバー環境)
上記Unit例(network-select.service)において、 network-pre.target は systemd に標準で存在する特殊な「パッシブユニット」と呼ばれるタイプです。
network-pre.target は、ネットワークインターフェースが構成される前に実行したいサービスのための同期ポイントです。
After=で、「ネットワーク構成が始まる前にこのUNITを実行して、DIPスイッチの状態に応じた設定を済ませておく」という流れが作っている。
また、Before=network-pre.targetでこのユニットが終わるまで network.target に到達しないようにしています。
(ネットワークが有効になる前にこのスクリプトを完了させる。)
次のような「パッシブユニット」が存在します。
network-pre.targetネットワーク構成前に実行したいサービス用で、一般にネットワーク設定前のAfter=で指定する。
network.targetネットワーク関連ユニットの起動後のタイミングに指定する場合に使う。但し疎通保証がないタイミング
network-online.targetネットワーク疎通が可能になった後(DHCP完了・リンク確立後)のタイミングの指定で使う。
local-fs.targetローカルファイルシステムのマウントが完了したことを示す同期ポイント。


ネットワーク関連のサービス

Wifiステーションモードでの起動

/usr/sbin/wpa_supplicantが/etc/wpa_supplicant/wpa_supplicant.confの設定ファイル (SSIDやパスフレーズなど、どのネットワークにどう接続するかを定義)を読んで、Wi-Fiに接続する実行ファイルです。
「supplicant(サプリカント)」とは英語で「要求者・申請者」という意味で、 Wi-Fi接続の際にクライアント側がアクセスポイントに対して認証をお願いする役割意味で、 Wi-Fi認証用のバックグラウンドプログラムです。
WPA:ダブリューピーエーの由来は「Wi-Fi Protected Access」の略で、無線LANのセキュリティ規格として Wi-Fi Alliance(無線LAN機器の普及と標準化を推進する業界団体)が策定したものです。
これ用のwpa_supplicant.serviceはあるのですが、直接使われないことが多いでしょう。
何故ならdhcpcdが自動的にインターフェースごとの wpa_supplicant を起動する使い方のケースが多いからです。

/usr/sbin/dhcpcdは、一般に、/etc/dhcpcd.confの内容でIPアドレスを決めます。
(静的IPが書かれていればそれを使うし、なければDHCPで取得。) なお、hcpcdを止めてもwpa_supplicantは自動では止まりません。wpa_supplicantを確実に止めるためには、明示的にkillするのが確実です。

Debian系(Raspberry Pi OS, Ubuntuなど)では、dhcpcd パッケージをインストールすると /lib/systemd/system/dhcpcd.serviceが が作成されます。
これで、DHCP サーバから IP アドレスを取得するための常駐サービスに登録できます。
これで、 ネットワークインターフェイス(eth0, wlan0 など)の IP アドレス、ルーティング、DNS設定を自動で行うことができます。

/etc/wpa_supplicant/wpa_supplicant.confの設定例を以下に示します。
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
        ssid="000740E60153"
        psk=3b648a0a819f13f67b5bafd6366a00726fb364aae5415a76fd099bbef8596ad0
}

/etc/dhcpcd.confの設定例を以下に示します。
# A sample configuration for dhcpcd.
# See dhcpcd.conf(5) for details.

# Allow users of this group to interact with dhcpcd via the control socket.
#controlgroup wheel

# Inform the DHCP server of our hostname for DDNS.
hostname

# Use the hardware address of the interface for the Client ID.
clientid
# or
# Use the same DUID + IAID as set in DHCPv6 for DHCPv4 ClientID as per RFC4361.
# Some non-RFC compliant DHCP servers do not reply with this set.
# In this case, comment out duid and enable clientid above.
#duid

# Persist interface configuration when dhcpcd exits.
persistent

# Rapid commit support.
# Safe to enable by default because it requires the equivalent option set
# on the server to actually work.
option rapid_commit

# A list of options to request from the DHCP server.
option domain_name_servers, domain_name, domain_search, host_name
option classless_static_routes
# Respect the network MTU. This is applied to DHCP routes.
option interface_mtu

# Most distributions have NTP support.
#option ntp_servers

# A ServerID is required by RFC2131.
require dhcp_server_identifier

# Generate SLAAC address using the Hardware Address of the interface
#slaac hwaddr
# OR generate Stable Private IPv6 Addresses based from the DUID
slaac private

# Example static IP configuration:
#interface eth0
#static ip_address=192.168.0.10/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
#static routers=192.168.0.1
#static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1

# It is possible to fall back to a static IP if DHCP fails:

上記の解説
#controlgroup wheelwheel グループのユーザーに、dhcpcd の制御ソケットを通じて操作を許可する設定。コメントアウトされているので無効
hostnameDHCP サーバーに対して、自分のホスト名を通知する。DDNS(動的DNS更新)に使われる。
clientidDHCP クライアントIDとして、インターフェイスのMACアドレスを使用する。
#duidClientID には DHCPv6 で設定されているものと同じ DUID + IAID を使用します。(非RFC準拠のサーバーでは応答しない場合がある)
persistentdhcpcd が終了しても、インターフェイスの設定(IPアドレスなど)を保持する。
option rapid_commit DHCPの「Rapid Commit」機能を有効化。サーバー側も対応している場合、通常の2段階ハンドシェイクを省略して高速にIPを取得できる。
option domain_name_servers, domain_name, domain_search, host_name DHCPサーバーから要求するオプションの一覧。DNSサーバー、ドメイン名、検索ドメイン、ホスト名など。
option classless_static_routesDHCPサーバーからクラスレス静的ルート情報を受け取る。
option interface_mtuネットワークMTU(最大転送単位)を尊重する。
#option ntp_servers NTPサーバー情報を要求するオプション。コメントアウトされているので無効。
require dhcp_server_identifierRFC2131に従い、DHCPサーバー識別子(ServerID)が必須であることを指定。
#slaac hwaddrMACアドレスベースで生成される。無効
slaac privateIPv6アドレスを生成する際、DUIDに基づいた「安定したプライベートアドレス」を使用する。
#interface eth0有線LANインターフェイス eth0 を対象にする 無効指定
#static ip_address=192.168.0.10/24IPv4 の固定IPを指定
#static ip6_address=fd51:42f8:caae:d92e::ff/64IPv6 の固定IPを指定
#static routers=192.168.0.1デフォルトゲートウェイを指定
#static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1DNSサーバーを指定(複数可)
# It is possible to fall back to a static IP if DHCP fails:DHCPでIPが取得できなかった場合に、静的IPへフォールバックすることも可能する指定 無効


アクセスポイント(AP)モードでの起動

/usr/sbin/hostapdが/etc/hostapd/hostapd.confの設定ファイル (SSIDやパスフレーズなど、WPA/WPA2の暗号化などを定義)を読んで、 Wi-Fiアクセスポイント(AP)を作るための実行ファイルです。
(Rasberry PIではsudo apt update、そして sudo apt install hostapdによるインストールが必要でした。)
アクセスポイント(AP)モードにするためには、「hostapd:ホスト エイ ピー エー ディー」を使う。
これは host (ホスト) と、AP (アクセスポイント)と、daemon (デーモン)を合わせたものです。
/lib/systemd/system/hostapd.serviceのサービスで起動登録ができます。

/usr/sbin/dnsmasqが/etc/dnsmasq.confの設定ファイル (DHCPサーバーなどの設定を定義)を読んで、 DHCP、DNSキャッシュ、DNSフォワーディング機能やなどの実行ファイルです。
dnsmasq(ディー・エヌ・エス・マスク)とはDNS masquerade(マスカレード)に由来する名前です。
サービス登録は、/lib/systemd/system/dnsmasq.serviceで行います。
また、アクセスポイント(AP)モードでの起動する時の/etc/dhcpcd.conf内容は、次のようにwlan0 を静的 IP に設定しなければなりません。
# --- WiFi AP mode static IP settings ---
interface wlan0
static ip_address=192.168.4.1/24
nohook wpa_supplicant

/etc/hostapd/hostapd.confの設定ファイルを以下に示します。
# ========== HostAPD default configuration ==========
interface=wlan0
driver=nl80211

# AP の SSID(任意に変更してください)
ssid=RasPi3P-AP
hw_mode=g
channel=6

# 国コード(必ず設定)
country_code=JP

# 出力を抑えて省電力化
ieee80211n=1
ieee80211d=1
ignore_broadcast_ssid=0

# セキュリティ
wpa=2
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

# AP のパスワード(8文字以上)
wpa_passphrase=abcd1234

# 自動再起動
logger_syslog=0
logger_syslog_level=4
/etc/dnsmasq.confの設定ファイルを以下に示します。(個別設定は/etc/dnsmasq.d/に置きます)
# ----------------------------
# dnsmasq for Wi-Fi AP (wlan0)
# ----------------------------

interface=wlan0          # AP が使うインターフェイス
bind-interfaces          # 他のインターフェイスにバインドしない

# DHCP で配布する IP レンジ(例: 192.168.4.x)
dhcp-range=192.168.4.50,192.168.4.150,255.255.255.0,24h

# AP のゲートウェイは AP 自身 (固定IP)
dhcp-option=3,192.168.4.1

# DNS サーバ(Raspberry Pi 自身)
dhcp-option=6,192.168.4.1

# ホスト名を配布
dhcp-authoritative

linux systemctlの問題点を調べる方法を示します。




その他

一方、serviceは、/etc/init.dにあるシェルスクリプトのファイルを指定することで、シェルを実行してくれるものがある。

pi@raspberrypi:~ $ sudo service dnsmasq stop
stop,start,status,restart などが使える。
以前は、chkconfig でランレベル指定して初期起動のon/offや状態を確認できましたが、現在は使われなくなっています。

serviceとsystemctlはどちらを使うか?

どちらも使える状態であれば、systemctlを使うの方が簡単で、 systemctlは標準でenableと言うコマンドが入っており、systemctl enable mysqlとすることでOSが起動した時に自動でコマンドを実行してくれるようになる