CentOS | cron | log > サーバーのrunning processのログを取る作業

```txt:動作環境
Xeon E5-2620 v4 (8コア) x 2
32GB RAM
CentOS 6.8 (64bit)
NCAR Command Language Version 6.3.0
for WRF3.7.1, WPS3.7.1
  openmpi-1.8.x86_64 とその-devel
  mpich.x86_64 3.1-5.el6とその-devel
  gcc version 4.4.7 (とgfortran)
for WRF3.9, WPS3.9
  Open MPI v2.1.1
  gcc version 4.9.2 (とgfortran; devtoolset-3使用)
　NetCDF v4.4.1.1, NetCDF (Fortran API) v4.4.4
Python 2.6.6 (r266:84292, Aug 18 2016, 15:13:37) 
Python 3.6.0 on virtualenv
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
date (GNU coreutils) 8.4 
tmux 1.6-3.el6
```

### 実装内容

- [CentOS > 謎の再起動 > 08:49 x 4 > 現在時刻の6分前](https://qiita.com/7of9/items/b0c6e9a09dc4379f82fb)

原因不明の再起動を起こしたサーバー。
今後の原因調査のため、@tukiyo3 さんの[コメント](https://qiita.com/7of9/items/b0c6e9a09dc4379f82fb#comment-21a45894d3d7ec6fdf62)の方法でログを取ってみます。

### ログの概要

- 出力先は`/home/wrf/LOG_SERVER_180308`
    - mkdirしておく
- 日付のディレクトリを作成し、日付ごとにログを取る
    - 例: `/home/wrf/LOG_SERVER_180308/2018-03-08`
- ログの出力は1分間隔とする
    - 今後変更するかもしれない
    - 例: `/home/wrf/LOG_SERVER_180308/2018-03-08/log_proc_2018-03-08_105501`
    - 例: `/home/wrf/LOG_SERVER_180308/2018-03-08/log_proc_2018-03-08_105601`

### bash script v0.1

**(追記 2018/03/08) v0.2を後で記載しています。**

```bash:log_runnig_process_180308_exec
#!/usr/bin/env bash

# v0.1 Mar. 8, 2018
#  - log running process
#     + to take difference between before- and after- the unintended reboot
#     + CentOS 6.8 used for WRF
#

set -eu

BASE_DIR=/home/wrf/LOG_SERVER_180308
SUB_DIR=$(date "+%Y-%m-%d")
PREFIX="log_proc"
TIMESTAMP="$(date "+%Y-%m-%d_%H%M%S")"
WORK_DIR=$BASE_DIR/$SUB_DIR

set +e  # to prevent "mkdir: cannot create directory" for existing dir.
mkdir $WORK_DIR
set -e
FILEPATH=$WORK_DIR/${PREFIX}_${TIMESTAMP}

ps -ef > $FILEPATH
```

`set +e`は下記と関連する。

- [bash > set -eu > diffの実行から下の処理が実行されない > diffのexit codeが異なるため | no_exit_diff()関数を用意する](https://qiita.com/7of9/items/67a2556ca3f942bf005c)


### cron設定 v0.1
**(追記 2018/03/08) v0.2を後で記載しています。**

```
$ sudo cat /var/spool/cron/y_okada
30 20 * * * /home/wrf/TOOL/backup_exec
*/1 * * * * /home/wrf/TOOL/log_runnig_process_180308_exec
```

1つ目はプログラムのバックアップ用の処理 (今回の内容とは無関係)。
2つ目が今回追加したもの。

### 備考

1分ごとにmailがやってくる。
mailの処理をしないといけない。
backup_execのメールが埋もれる。

1分ごとにコマンドを実行するPythonスクリプトを実装し、それを起動し続けるという方法もある。

メモ: サーバーの時計が7分ずれていることに気付いた (実際の時刻 - 7分)。

### 関連

- [CentOS > 謎の再起動 > 08:49 x 4 > 現在時刻の6分前](https://qiita.com/7of9/items/b0c6e9a09dc4379f82fb)
- [CentOS > cron設定の消失](https://qiita.com/7of9/items/0013339417e53cb7bdd8)


### bash script v0.2

```bash:log_runnig_process_180308_exec
#!/usr/bin/env bash

# v0.2 Mar. 8, 2018
#  - use [mkdir -p] for existing directories
# v0.1 Mar. 8, 2018
#  - log running process
#     + to take difference between before- and after- the unintended reboot
#     + CentOS 6.8 used for WRF
#

set -eu

BASE_DIR=/home/wrf/LOG_SERVER_180308
SUB_DIR=$(date "+%Y-%m-%d")
PREFIX="log_proc"
TIMESTAMP="$(date "+%Y-%m-%d_%H%M%S")"
WORK_DIR=$BASE_DIR/$SUB_DIR

mkdir -p $WORK_DIR
FILEPATH=$WORK_DIR/${PREFIX}_${TIMESTAMP}

ps -ef > $FILEPATH
```


### ログのdiff

```
$ diff log_proc_2018-03-08_112101 log_proc_2018-03-08_112201
667,669c667,669
< root      7863  5964  0 11:21 ?        00:00:00 CROND
< y_okada   7864  7863  0 11:21 ?        00:00:00 bash /home/wrf/TOOL/log_runnig_process_180308_exec
< y_okada   7868  7864  0 11:21 ?        00:00:00 ps -ef
---
> root      7871  5964  0 11:22 ?        00:00:00 CROND
> y_okada   7872  7871  0 11:22 ?        00:00:00 bash /home/wrf/TOOL/log_runnig_process_180308_exec
> y_okada   7876  7872  0 11:22 ?        00:00:00 ps -ef
```

ログを取るための処理がログに記載される。

> 1分ごとにコマンドを実行するPythonスクリプトを実装し、それを起動し続けるという方法もある。

にした方がいいかもしれない。
(1分ごとにインターバル処理するbashスクリプトでも)。

### cron設定 v0.2

@tukiyo3 さんの[コメント](https://qiita.com/7of9/items/ed4d361d03b69934d7f5/#comment-6b61bbbfd5ec97dc634b)
にて色々な方法を提案いただきました。

情報感謝です。
「標準出力は捨てる方法」を使わせていただきます。