スクリプトを秒単位で実行するサービスの作り方

Node.js の `node-cron` ライブラリを使用して `/home/bitnami/Script/sync_script.sh` スクリプトを秒単位で実行するための手順です。

### ステップ 1: Node.js と npm のインストール

1. **Debian システムで Node.js と npm をインストール**:
   - ターミナルを開き、以下のコマンドを実行して Node.js と npm をインストールします：
     ```bash
     sudo apt update
     sudo apt install nodejs npm
     ```
   - インストールが完了したら、以下のコマンドでバージョンを確認し、正しくインストールされていることを確認します：
     ```bash
     node -v
     npm -v
     ```

### ステップ 2: node-cron ライブラリのインストール

1. **プロジェクトディレクトリの作成**:
   - 新しいプロジェクト用のディレクトリを作成します。例えば `my-scheduled-task` という名前で作成するには：
     ```bash
     mkdir my-scheduled-task
     cd my-scheduled-task
     ```

2. **node-cron のインストール**:
   - npm を使用して `node-cron` ライブラリをインストールします：
     ```bash
     npm init -y
     npm install node-cron
     ```

### ステップ 3: スクリプトの作成

1. **スクリプトの作成**:
   - `my-scheduled-task` ディレクトリ内に `schedule.js` という名前のファイルを作成します。
   - `schedule.js` に以下の内容を記述します：
     ```javascript
     const cron = require('node-cron');
     const { exec } = require('child_process');

     cron.schedule('* * * * * *', () => {
         console.log('Running sync_script.sh every second');
         exec('/home/bitnami/Script/sync_script.sh', (error, stdout, stderr) => {
             if (error) {
                 console.error(`Error: ${error}`);
                 return;
             }
             console.log(`stdout: ${stdout}`);
             console.error(`stderr: ${stderr}`);
         });
     });
     ```
   - このスクリプトは、指定された `sync_script.sh` を毎秒実行します。

2. **スクリプトの実行**:
   - `schedule.js` を Node.js で実行するには、以下のコマンドを使用します：
     ```bash
     node schedule.js
     ```

以下に、`/home/bitnami/my-scheduled-task/schedule.js` スクリプトを `systemd` を使ってサービスとして実行する手順になります。

### ステップ 4: サービスファイルの作成

1. **サービスファイルを作成**:
   - ターミナルを開き、`/etc/systemd/system/` ディレクトリに新しいサービスファイル（例えば `node-schedule.service`）を作成します。
   - 以下のコマンドを実行してエディタを開きます：
     ```bash
     sudo nano /etc/systemd/system/node-schedule.service
     ```

2. **サービスファイルに内容を記述**:
   - 次の内容をサービスファイルに入力します：

     ```
     [Unit]
     Description=Node.js Schedule Script

     [Service]
     ExecStart=/usr/bin/node /home/bitnami/my-scheduled-task/schedule.js
     Restart=always
     User=bitnami
     Group=bitnami
     Environment=PATH=/usr/bin:/usr/local/bin
     Environment=NODE_ENV=production
     WorkingDirectory=/home/bitnami/my-scheduled-task/

     [Install]
     WantedBy=multi-user.target
     ```

3. **ファイルを保存してエディタを閉じる**:
   - ファイルを保存してエディタを閉じます（Nanoエディタの場合は `Ctrl + X`、`Y`、`Enter`）。

### ステップ 5: サービスの有効化と起動

1. **サービスのリロード**:
   - システムに新しいサービスを認識させるため、次のコマンドを実行します：
     ```bash
     sudo systemctl daemon-reload
     ```

2. **サービスの有効化**:
   - サービスを自動起動するように設定します：
     ```bash
     sudo systemctl enable node-schedule.service
     ```

3. **サービスの起動**:
   - 作成したサービスを起動します：
     ```bash
     sudo systemctl start node-schedule.service
     ```

4. **サービスの状態確認**:
   - サービスが正しく動作しているか確認するため、次のコマンドを実行します：
     ```bash
     sudo systemctl status node-schedule.service
     ```

これで、`/home/bitnami/my-scheduled-task/schedule.js` スクリプトが `systemd` サービスとして設定され、指定したユーザー（`bitnami`）で実行されます。サービスはシステム起動時に自動的に開始され、スクリプトが終了した場合は自動的に再起動されます。



### 【追記】
`systemd`を使用してLinuxシステム上でNode.jsスクリプトをサービスとして実行し、そのログ出力を制御する方法を説明しています。

### ログ出力の削減

1. **`schedule.js` スクリプトの修正**:
   - `schedule.js` スクリプトを開き、不要な `console.log` と `console.error` の呼び出しを削除またはコメントアウトします。
   - スクリプトが毎秒実行されるため、ログ出力は必要最低限に抑えてください。

### `systemd` サービスファイルの編集

1. **サービスファイルの編集**:
   - 以下のコマンドを使用して `node-schedule.service` ファイルを開きます：
     ```bash
     sudo nano /etc/systemd/system/node-schedule.service
     ```

2. **サービスファイルの修正**:
   - ファイルに以下の行を追加してログ出力を抑制します：
     ```
     [Service]
     ...
     StandardOutput=null
     StandardError=null
     ```

3. **ファイルの保存と終了**:
   - 変更を行ったら、ファイルを保存してエディタを閉じます。

### サービスの再読み込みと再起動

1. **`systemd` のリロード**:
   - 変更を適用するために、以下のコマンドを実行して `systemd` をリロードします：
     ```bash
     sudo systemctl daemon-reload
     ```

2. **サービスの再起動**:
   - 以下のコマンドでサービスを再起動します：
     ```bash
     sudo systemctl restart node-schedule.service
     ```

### ログの確認方法

- **ログの表示**:
  - サービスのログを確認するには、以下のコマンドを実行します：
    ```bash
    sudo journalctl -u node-schedule.service
    ```

- **リアルタイムのログ監視**:
  - リアルタイムでのログ監視には、以下のコマンドを使用します：
    ```bash
    sudo journalctl -f -u node-schedule.service
    ```

これらの手順により、`node-schedule` サービスのログ出力を効果的に抑制し、必要に応じてログを確認することができます。