コマンドのバックグラウンド実行とログ管理


# サーバー上でのコマンド実行とログ管理

みなさん、サーバー上でバックグラウンドで実行するコマンドのログ管理や、何日の何時に何のコマンドを打ったかのログを取るのに困っていませんか？

例えば、長時間実行される解析ツールやバイオインフォマティクスツールを実行する場合、その実行状況を確認したり、エラーログを後で確認する必要があることがあります。そんなときに便利なのが、nohupコマンドを使ってコマンドをバックグラウンドで実行し、ログを自動的に保存する方法です。

## 実行スクリプトの説明

以下に示すシェルスクリプトは、指定されたコマンドをバックグラウンドで実行し、そのログをタイムスタンプ付きのファイルに保存する方法です。このスクリプトを使うことで、コマンドの実行結果やエラーメッセージを後で確認することができます。

### シェルスクリプトの内容

```bash
nohup sh -c "
LOG_FILE="/path/to/log/\$(date '+%Y%m%d_%H%M%S')_${TAG}.txt"
echo "Executed command: ${CMD}" > \$LOG_FILE
${CMD} >> \$LOG_FILE 2>&1
" &
```

## 使用方法の説明

このスクリプトを使用するには、環境変数`CMD`と`TAG`を設定してから実行します。また、事前にログディレクトリを作成しておく必要があります。以下に例を示します：

1. **ログディレクトリの作成**

   ```bash
   mkdir -p /path/to/log
   ```

   `mkdir -p`コマンドを使用して、ログを保存するディレクトリを作成します。`/path/to/log`はログファイルを保存するディレクトリのパスです。

2. **環境変数の設定とスクリプトの実行**

   ```bash
   export CMD="ここにコマンドを入力"
   export TAG="コマンドの説明やタグ"
   nohup sh -c "
   LOG_FILE="/path/to/log/\$(date '+%Y%m%d_%H%M%S')_${TAG}.txt"
   echo "Executed command: ${CMD}" > \$LOG_FILE
   ${CMD} >> \$LOG_FILE 2>&1
   " &
   ```

   - `CMD`変数に実行したいコマンドを入力します。
     例: `export CMD="python my_script.py"`
   - `TAG`変数には、コマンドの説明やタグを入力します。
     例: `export TAG="python_script_execution"`

## 使用例

### Pythonスクリプトの実行例

```bash
export CMD="python my_script.py"
export TAG="python_script_execution"
nohup sh -c "
LOG_FILE="/path/to/log/\$(date '+%Y%m%d_%H%M%S')_${TAG}.txt"
echo "Executed command: ${CMD}" > \$LOG_FILE
${CMD} >> \$LOG_FILE 2>&1
" &
```

この例では、Pythonスクリプト`my_script.py`をバックグラウンドで実行し、その出力とエラーメッセージを`/path/to/log/`ディレクトリ内のタイムスタンプ付きログファイルに記録します。

生成されるログファイルの例:
```
/path/to/log/20240523_153045_python_script_execution.txt
```

### BUSCOコマンドの実行例

バイオインフォマティクスツールであるBUSCOを使用する場合も同様に、このスクリプトを使用して実行結果を記録することができます。

```bash
export CMD="busco -i input.fasta -o output_directory -l lineage_dataset -m genome"
export TAG="busco_run"
nohup sh -c "
LOG_FILE="/path/to/log/\$(date '+%Y%m%d_%H%M%S')_${TAG}.txt"
echo "Executed command: ${CMD}" > \$LOG_FILE
${CMD} >> \$LOG_FILE 2>&1
" &
```

この例では、BUSCOコマンドをバックグラウンドで実行し、その出力とエラーメッセージを`/path/to/log/`ディレクトリ内のタイムスタンプ付きログファイルに記録します。

生成されるログファイルの例:
```
/path/to/log/20240523_153045_busco_run.txt
```

## 最新のログファイルを閲覧する方法

バックグラウンドで実行されるコマンドのログファイルは、タイムスタンプ付きで保存されるため、複数のログファイルが生成されることがあります。以下に、最新のログファイルを確認する方法をいくつか紹介します。

1. **最新のログファイルをリスト表示**

   ```bash
   ls -lt /path/to/log/ | head -n 5
   ```

   このコマンドは、ログディレクトリ内のファイルをタイムスタンプ順にソートし、最新の5つのファイルをリスト表示します。

2. **最新のログファイルを表示**

   ```bash
   less "$(ls -t /path/to/log/ | head -n 1 | xargs -I {} echo /path/to/log/{})"
   ```

   このコマンドは、最新のログファイルを表示します。`less`コマンドを使ってファイル内容をスクロールしながら確認できます。

## ショートカットアプリへの登録

紹介したコマンドは、Macのショートカットアプリに登録して、メニューバーに常駐させておくと、ワンクリックで使用できるので便利です。以下のリンクからショートカットをダウンロードして使用してみてください。

### nohupコマンドをクリップボードにコピー

```bash
nohup sh -c "
LOG_FILE="/path/to/log/\$(date '+%Y%m%d_%H%M%S')_${TAG}.txt"
echo "Executed command: ${CMD}" > \$LOG_FILE
${CMD} >> \$LOG_FILE 2>&1
" &
```
[ショートカットをダウンロード](https://www.icloud.com/shortcuts/986424d8e5f3459b9a267dbd84542d0a)

### 最新のログファイルをリスト表示

```bash
ls -lt ~/log/ | head -n 5
```
[ショートカットをダウンロード](https://www.icloud.com/shortcuts/a23c8a9df0304749bf95a66894096662)

### 最新のログファイルを表示

```bash
less "$(ls -t ~/log/ | head -n 1 | xargs -I {} echo ~/log/{})"
```
[ショートカットをダウンロード](https://www.icloud.com/shortcuts/7e3d71e1fc6e4c8691f7f9234f56e7e3)

## まとめ

この方法により、シェルスクリプトの実行を自動化し、後で確認できるようにログを保存することができます。特に、長時間実行されるコマンドや、実行結果を後で確認する必要がある場合に便利です。また、ログファイルの管理と確認方法を習得することで、サーバー上での作業効率をさらに向上させることができます。ぜひ、このスクリプトと方法を活用して、サーバー上での作業をスムーズに進めてください。