systemctl を使って C サーバを自動起動
C 言語で作成したシンプルな HTTP サーバ(server バイナリ)を systemd により起動時に自動実行する手順を紹介します。
※ ポート 80 でバインドするため、実行時は管理者権限が必要
前提条件
手順
1. バイナリの配置と実行権限の設定
まず、server バイナリを /usr/local/bin/ にコピーし、実行権限を付与します。
sudo cp server /usr/local/bin/
sudo chmod +x /usr/local/bin/server
2. ローカルでの実行確認
直接実行すると「Permission denied」などのエラーが出る場合がありますが、これは特権ポートへのバインド権限の問題です。
/usr/local/bin/server
# bind failed: Permission deni
3. systemd ユニットファイルの作成
/etc/systemd/system/server.service を作成します。
内容は以下の通りです。
[Unit]
Description=Simple HelloWorld Server
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/server
Restart=on-failure
[Install]
WantedBy=multi-user.target
エディタで作成する場合:
sudo nano /etc/systemd/system/server.service
4. systemd の再読み込みとサービスの有効化
ユニットファイルを認識させ、サービスを有効化します。
sudo systemctl daemon-reload
sudo systemctl enable server.service
5. サービスの状態確認と起動
まずはサービスの状態を確認します。
sudo systemctl status server.servic
初回は inactive (dead) と表示される場合がありますが、次のコマンドで起動します。
sudo systemctl start server.service
再度状態を確認すると、active (running) となっているはずです。
sudo systemctl status server.service
以下は実際の出力例です。
hitto@raspiz:/opt/server $ sudo cp server /usr/local/bin/
sudo chmod +x /usr/local/bin/server
hitto@raspiz:/opt/server $ /usr/local/bin/server
bind failed: Permission denied
hitto@raspiz:/opt/server $ cd /usr/local/bin/
hitto@raspiz:/usr/local/bin $ ls
server
hitto@raspiz:/usr/local/bin $ sudo nano /etc/systemd/system/server.service
hitto@raspiz:/usr/local/bin $ sudo systemctl daemon-reload
hitto@raspiz:/usr/local/bin $ sudo systemctl status server.service
○ server.service - Simple HelloWorld Server
Loaded: loaded (/etc/systemd/system/server.service; disabled; preset: enabled)
Active: inactive (dead)
hitto@raspiz:/usr/local/bin $ sudo systemctl enable server.service
Created symlink /etc/systemd/system/multi-user.target.wants/server.service → /etc/systemd/system/server.service.
hitto@raspiz:/usr/local/bin $ sudo systemctl status server.service
○ server.service - Simple HelloWorld Server
Loaded: loaded (/etc/systemd/system/server.service; enabled; preset: enabled)
Active: inactive (dead)
hitto@raspiz:/usr/local/bin $ sudo systemctl start server.service
hitto@raspiz:/usr/local/bin $ sudo systemctl status server.service
● server.service - Simple HelloWorld Server
Loaded: loaded (/etc/systemd/system/server.service; enabled; preset: enabled)
Active: active (running) since Mon 2025-02-03 14:53:44 GMT; 3s ago
Main PID: 1058 (server)
Tasks: 1 (limit: 387)
CPU: 12ms
CGroup: /system.slice/server.service
└─1058 /usr/local/bin/server
Feb 03 14:53:44 raspiz systemd[1]: Started server.service - Simple HelloWorld Server.
hitto@raspiz:/usr/local/bin $
動作確認
サービスが起動している状態で、別の端末から curl を実行して動作確認を行います。
hitto@raspiz:~ $ curl http://localhost/
helloworldhitto@raspiz:~ $
レスポンスとして helloworld が返されれば成功です。
← Go home