systemctl

GitHub actions でci/cdを使用します pushした際にサーバーにssh接続し、現在動いているサービスを終了し、pullし、実行するようにしたい

GitHub Actionsを使用してCI/CDパイプラインを構築し、リポジトリにプッシュされたときにサーバーにSSH接続して現在動いているサービスを終了し、新しいコードをプルして再度実行する手順を以下に示します。

  • SSHキーの設定
    • サーバーに接続するためのSSHキーを作成し、GitHub Secretsに保存します。
    • ローカルでSSHキーを生成します(既にキーがある場合はスキップ):
    • 生成された公開鍵 (~/.ssh/id_rsa.pub) をサーバーの ~/.ssh/authorized_keys に追加します。
    • 秘密鍵 (~/.ssh/id_rsa) をGitHubリポジトリのSecretsに SSH_PRIVATE_KEY として追加します。
  • GitHub Actionsワークフローの作成
    • リポジトリのルートに .github/workflows/deploy.yml ファイルを作成します。
    • 以下の内容を deploy.yml に記載します:
    • 上記のスクリプトでは、your_serveruseryour_service、および /path/to/your/app を実際の環境に合わせて置き換えてください。
  • 追加の設定
    • サーバー上でサービスを管理するためのSystemdユニットファイルがあることを確認してください。例えば、/etc/systemd/system/your_service.service に以下のような内容が含まれているはずです:
    • サービスを有効にして開始します:
  • これで、リポジトリに変更をプッシュすると、GitHub Actionsがトリガーされ、サーバーにSSHで接続してデプロイプロセスが自動で実行されるようになります。

    ここから

    systemctlは、Linuxのsystemd initシステムを操作するためのコマンドラインツールです。systemdは、Linuxカーネルの起動プロセスを管理し、システムやサービスの起動、停止、再起動、ステータス確認などを行います。以下では、systemctlの基本的な使い方といくつかの重要なコマンドについて説明します。

    基本コマンド

    サービスの管理

  • サービスの開始
      sudo systemctl start <service_name>

      例:

      sudo systemctl start apache2
  • サービスの停止
      sudo systemctl stop <service_name>

      例:

      sudo systemctl stop apache2
  • サービスの再起動
      sudo systemctl restart <service_name>

      例:

      sudo systemctl restart apache2
  • サービスの状態確認
      systemctl status <service_name>

      例:

      systemctl status apache2
  • サービスの有効化(自動起動設定)
      sudo systemctl enable <service_name>

      例:

      sudo systemctl enable apache2
  • サービスの無効化(自動起動解除)
      sudo systemctl disable <service_name>

      例:

      sudo systemctl disable apache2
  • システムの管理

  • システムの再起動
      sudo systemctl reboot
  • システムのシャットダウン
      sudo systemctl poweroff
      
      
  • 現在のランレベル(ターゲット)を表示
      systemctl get-default
      
      
  • ランレベル(ターゲット)の変更
      sudo systemctl set-default <target>
      
      

      例:

      sudo systemctl set-default multi-user.target
      
      
  • サービスのユニットファイル

    systemctlで管理されるサービスは、ユニットファイル(通常は/etc/systemd/system//lib/systemd/system/に保存されている)によって構成されています。ユニットファイルの基本構造は以下のようになります:

    [Unit]
    Description=Example Service
    After=network.target
    
    [Service]
    ExecStart=/usr/bin/example-service
    Restart=always
    User=example-user
    
    [Install]
    WantedBy=multi-user.target
    
    

    重要なユニットファイルのセクション

  • [Unit]: ユニットの説明や依存関係を定義します。
  • [Service]: サービスの実行方法や再起動ポリシーを定義します。
  • [Install]: ユニットを有効にするための設定を定義します。
  • ログの確認

    systemdによって管理されているサービスのログを確認するには、journalctlコマンドを使用します:

    journalctl -u <service_name>
    
    

    例:

    journalctl -u apache2
    
    

    これで、systemctlの基本的な使い方についての概要は理解できると思います。詳細な使い方やオプションについては、公式ドキュメントや man systemctl コマンドを参照してください。

    pythonのプログラムをsystemctlとして実行する

    ユニットファイルを作成し、Pythonプログラムを適切に設定する必要があります。以下に手順を示します。

    手順

  • Pythonプログラムの準備
    • 例えば、/usr/local/bin/my_python_script.py というPythonスクリプトがあるとします。このスクリプトには以下のような内容が含まれているとします:
    • スクリプトに実行権限を付与します:
  • ユニットファイルの作成
    • ユニットファイルを /etc/systemd/system/my_python_service.service に作成します。
    • ファイルの内容は以下のようにします:
  • ユニットファイルのリロード
    • 新しいユニットファイルをsystemdに認識させるために、デーモンをリロードします:
  • サービスの有効化と開始
    • サービスを有効にして、システム起動時に自動的に開始されるようにします:
    • サービスを開始します:
  • サービスの状態確認
    • サービスの状態を確認して、正常に動作していることを確認します:
    • 正常に動作していれば、次のような出力が得られます:
  • ユニットファイルの詳細説明

  • [Unit] セクション:
    • Description:サービスの説明。
    • After:このサービスが起動する前に起動する必要がある他のユニット。
  • [Service] セクション:
    • ExecStart:サービスを開始するコマンド。
    • Restart:サービスが終了した場合に再起動するポリシー。
    • User と Group:サービスが実行されるユーザーとグループ。
  • [Install] セクション:
    • WantedBy:このサービスがどのターゲットに関連付けられているかを定義。
  • これにより、Pythonプログラムをsystemdサービスとして実行することができます。サービスの管理は、通常のsystemdサービスと同様に、startstoprestartstatusコマンドを使用して行うことができます。

    systemctlを使用するメリットを教えて下さい

    systemctlを使用するメリットは多岐にわたります。以下にその主なメリットを挙げます:

    1. 一貫した管理インターフェース

  • systemctlは、サービス、デバイス、ソケット、タイマー、スワップ、マウントポイントなど、さまざまなシステムリソースの管理を統一されたインターフェースで提供します。
  • 管理者が一貫したコマンドセットでこれらのリソースを操作できるため、学習コストが低くなります。
  • 2. 依存関係の管理

  • systemdは、サービス間の依存関係を自動的に管理します。例えば、あるサービスがネットワーク接続を必要とする場合、そのサービスが開始される前にネットワーク関連のサービスが確実に起動されます。
  • 3. 自動再起動

  • systemctlで管理されるサービスは、自動再起動機能を持つことができます。これにより、サービスがクラッシュした場合や予期せず終了した場合に自動的に再起動され、サービスの可用性が向上します。
      
      [Service]
      Restart=always
      
      
  • 4. ログ管理

  • systemdは、サービスのログをジャーナルに記録し、journalctlコマンドで簡単にアクセスできます。これにより、ログ管理が統一され、問題のトラブルシューティングが容易になります。
      
      journalctl -u <service_name>
      
      
  • 5. リソース制限

  • systemdは、CPU、メモリ、ディスクI/Oなどのリソース制限を設定することができます。これにより、特定のサービスが他のシステムリソースを過剰に消費しないように制御できます。
      
      [Service]
      CPUQuota=20%
      
      
  • 6. タイマーとスケジューリング

  • systemdは、cronのようにタイマーを設定して、特定の時間にジョブを実行することができます。これにより、システムタスクのスケジューリングが統合されます。
      
      [Timer]
      OnCalendar=daily
      
      
  • 7. ユーザーモード

  • systemdは、システム全体のサービスだけでなく、個々のユーザーに対してもサービスを管理できます。これにより、ユーザーごとに異なるサービスを簡単に設定できます。
      
      systemctl --user start my_user_service
      
      
  • 8. ユニットの依存関係とターゲット

  • systemdは、複雑なユニット依存関係を簡単に管理できます。ターゲットユニットを使用して、システムの特定の状態を定義し、その状態に基づいてサービスを起動または停止することができます。
      
      [Unit]
      Wants=network.target
      
      
  • 9. 高速な起動時間

  • systemdは並列にサービスを起動するため、システムの起動時間を短縮できます。起動時の依存関係を最適化し、同時に起動可能なサービスを並行して処理します。
  • 10. 簡単なサービス定義

  • systemdのユニットファイルは、シンプルな構造で、サービスの設定が簡単です。ユニットファイルのフォーマットは、直感的で理解しやすいものになっています。
  • まとめ

    systemctlとsystemdを使用することで、サービス管理が統一され、システムの信頼性と可用性が向上します。また、依存関係管理、自動再起動、ログ管理、リソース制限など、多くの機能が一つのツールで提供されるため、システム管理が効率化されます。これらのメリットにより、systemdは多くのLinuxディストリビューションで標準のinitシステムとして採用されています。

    問題点

    なぜかcpu使用率が多い

    要検証

    ← Go home