systemctl
GitHub actions でci/cdを使用します pushした際にサーバーにssh接続し、現在動いているサービスを終了し、pullし、実行するようにしたい
GitHub Actionsを使用してCI/CDパイプラインを構築し、リポジトリにプッシュされたときにサーバーにSSH接続して現在動いているサービスを終了し、新しいコードをプルして再度実行する手順を以下に示します。
- サーバーに接続するためのSSHキーを作成し、GitHub Secretsに保存します。
- ローカルでSSHキーを生成します(既にキーがある場合はスキップ):
- 生成された公開鍵 (~/.ssh/id_rsa.pub) をサーバーの ~/.ssh/authorized_keys に追加します。
- 秘密鍵 (~/.ssh/id_rsa) をGitHubリポジトリのSecretsに SSH_PRIVATE_KEY として追加します。
- リポジトリのルートに .github/workflows/deploy.yml ファイルを作成します。
- 以下の内容を deploy.yml に記載します:
- 上記のスクリプトでは、your_server、user、your_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
重要なユニットファイルのセクション
ログの確認
systemdによって管理されているサービスのログを確認するには、journalctlコマンドを使用します:
journalctl -u <service_name>
例:
journalctl -u apache2
これで、systemctlの基本的な使い方についての概要は理解できると思います。詳細な使い方やオプションについては、公式ドキュメントや man systemctl コマンドを参照してください。
pythonのプログラムをsystemctlとして実行する
ユニットファイルを作成し、Pythonプログラムを適切に設定する必要があります。以下に手順を示します。
手順
- 例えば、/usr/local/bin/my_python_script.py というPythonスクリプトがあるとします。このスクリプトには以下のような内容が含まれているとします:
- スクリプトに実行権限を付与します:
- ユニットファイルを /etc/systemd/system/my_python_service.service に作成します。
- ファイルの内容は以下のようにします:
- 新しいユニットファイルをsystemdに認識させるために、デーモンをリロードします:
- サービスを有効にして、システム起動時に自動的に開始されるようにします:
- サービスを開始します:
- サービスの状態を確認して、正常に動作していることを確認します:
- 正常に動作していれば、次のような出力が得られます:
ユニットファイルの詳細説明
- Description:サービスの説明。
- After:このサービスが起動する前に起動する必要がある他のユニット。
- ExecStart:サービスを開始するコマンド。
- Restart:サービスが終了した場合に再起動するポリシー。
- User と Group:サービスが実行されるユーザーとグループ。
- WantedBy:このサービスがどのターゲットに関連付けられているかを定義。
これにより、Pythonプログラムをsystemdサービスとして実行することができます。サービスの管理は、通常のsystemdサービスと同様に、start、stop、restart、statusコマンドを使用して行うことができます。
systemctlを使用するメリットを教えて下さい
systemctlを使用するメリットは多岐にわたります。以下にその主なメリットを挙げます:
1. 一貫した管理インターフェース
2. 依存関係の管理
3. 自動再起動
[Service]
Restart=always
4. ログ管理
journalctl -u <service_name>
5. リソース制限
[Service]
CPUQuota=20%
6. タイマーとスケジューリング
[Timer]
OnCalendar=daily
7. ユーザーモード
systemctl --user start my_user_service
8. ユニットの依存関係とターゲット
[Unit]
Wants=network.target
9. 高速な起動時間
10. 簡単なサービス定義
まとめ
systemctlとsystemdを使用することで、サービス管理が統一され、システムの信頼性と可用性が向上します。また、依存関係管理、自動再起動、ログ管理、リソース制限など、多くの機能が一つのツールで提供されるため、システム管理が効率化されます。これらのメリットにより、systemdは多くのLinuxディストリビューションで標準のinitシステムとして採用されています。
問題点
なぜかcpu使用率が多い
要検証
← Go home