systemctl を使って C サーバを自動起動

C 言語で作成したシンプルな HTTP サーバ(server バイナリ)を systemd により起動時に自動実行する手順を紹介します。

※ ポート 80 でバインドするため、実行時は管理者権限が必要

前提条件

  • コンパイル済みの server バイナリが存在する
  • バイナリを /usr/local/bin/ に配置する
  • root 権限で実行する(ポート 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

    ドキュメント: https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files#sect-Managing_Services_with_systemd-Unit_File_Structure

    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