CentOSサーバ作業に関する個人的Tips

(yyyy.mm.dd追記)

---

# はじめに

CentOSサーバ構築でよく検索することを個人的な備忘録がてら残します。
「前に検索したなこれ・・・」と思ったものは逐一追加していきます。

## コマンド関連

### tarコマンドによる圧縮/解凍

参考文献：[【 tar 】コマンド――アーカイブファイルを作成する／展開する](https://www.atmarkit.co.jp/ait/articles/1608/15/news015.html)

```
tar -zcvf xxxx.tar.gz 圧縮するディレクトリ # 圧縮

tar -zxvf xxxx.tar.gz # 解凍
```

※オプションの補足
- c：(圧縮のみ)新しいアーカイブを作成
- x：(解凍のみ)既存アーカイブより抽出
- f：アーカイブ指定
- v：詳細表示

### trコマンドによる小文字大文字変換

```
tr '[:upper:]' '[:lower:]' # 大文字→小文字

tr '[:lower:]' '[:upper:]' # 小文字→大文字
```

### nmtuiコマンドによるネットワーク設定

GUIのように設定できるコマンド
(構築時によく使うけどよく忘れるので備忘録がてら・・・)



## スクリプト関連

### シェルスクリプトテンプレート

#### 要件

- 特定の入力ディレクトリ内のファイルに対して繰り返し処理
- 出力は特定のディレクトリ
- どこでも実行できるようにしたい
- 開始、終了がわかるようにログに書き出したい
- 出力ディレクトリ、ログは初期化

#### シェルスクリプトテンプレート

```bash:テンプレート
#!/bin/bash
## 処理概要 ####################################################################
# どういった処理かざっくりと書く

## 変数 ########################################################################

# カレントディレクトリ取得
SCRIPT_DIR=$(cd $(dirname $0); pwd)

# 出力ログ
LOG="${SCRIPT_DIR}/$(basename $0 ".sh")_$(date +%Y%m%d).log"

# 適当なディレクトリ
INPUT_DIR="${SCRIPT_DIR}/xxx"

# 出力ディレクトリ
OUTPUT_DIR="${SCRIPT_DIR}/xxx"

# 適当なディレクトリの数
LIST_NUM=$(ls ${INPUT_DIR} | wc -l)

## 本処理 ######################################################################

# ログ生成(初期化)
cat /dev/null > ${LOG}

# 出力ディレクトリ存在確認
# 無ければディレクトリ作成し、存在する場合はディレクトリ内初期化
if [ -e ${OUTPUT_DIR} ]; then
  rm -rf ${OUTPUT_DIR}/*
else
  mkdir ${OUTPUT_DIR}
fi

echo "$(date +%T) 処理開始(対象：${LIST_NUM}件)" >> ${LOG}
echo >> ${LOG}

# 入力ファイル取得
INPUT_ARRAY=$(find ${INPUT_DIR} -maxdepth 1 -type f)

# INPUTファイル分書き出し
for file in ${INPUT_ARRAY}
do

  # 必要に応じてトリミング
  # INPUT_NAME=$(basename ${file})

  # いい感じの処理
  COMMAND -i ${file} -o ${OUTPUT_DIR}/${INPUT_NAME} >> ${LOG} 2>&1
  echo "$(date +%T) 処理完了：${INPUT_NAME}" >> ${LOG}
done

echo >> ${LOG}
echo "$(date +%T) 処理終了(総数：$(ls ${OUTPUT_DIR} | wc -l)件)" >> ${LOG}
echo "正常終了 LOG : ${LOG}"
```

#### 特定ファイルの更新がされているかチェック

```shell
#!/bin/bash
## 処理概要 ####################################################################
# 第一引数のファイルのタイムスタンプを参照し、前回チェック時から
# 更新されているかどうか確認する
## 変数 ########################################################################
# カレントディレクトリ取得
SCRIPT_DIR=$(cd $(dirname $0); pwd)
# 出力ログ
LOG="${SCRIPT_DIR}/$(basename $0 ".sh")_$(date +%Y%m%d).log"
## 引数 ########################################################################
if [ $# -ne 1 ]; then
        echo "実行するには2個の引数が必要です。
        第一引数: 監視対象ファイル名"
        exit 1
fi
## 本処理 ######################################################################
# ログ生成
echo "$(date +%T) 処理開始" >> ${LOG}
# 前回のタイムスタンプチェック結果があるか確認
# チェック結果がない場合、初回のためファイルを生成
if [ ! -e ${SCRIPT_DIR}/last_check_result ]; then
  ls --full-time $1 | awk '{print $6"-"$7}' > ${SCRIPT_DIR}/last_check_result
  echo "前回のチェック結果がないため、ファイル生成"  >> ${LOG}
# ある場合、現在のタイムスタンプと比較する
else
  # 今回の結果を取得
  CHECK_RESULT=`ls --full-time $1 | awk '{print $6"-"$7}'`
  # 前回の結果をファイルから取得
  CHECK_RESULT_BEFORE=`cat ${SCRIPT_DIR}/last_check_result`
  # 前回結果と今回の結果を比較し、差分がなければコマンドを実行
  if [ ${CHECK_RESULT} = ${CHECK_RESULT_BEFORE} ]; then
    # 更新されていなかったときに実行してほしいコマンドを入れてください！！！！
    echo "$1 is not updated from ${CHECK_RESULT} "
    # ログ書き出し
    echo "$(date +%T) アラート:対象ファイルが更新されていないためコマンド実行 ※時刻:${CHECK_RESULT}"  >> ${LOG}
  # 更新されていたら、今回の結果を前回結果に置き換えその旨ログ出力
  else
    echo "${CHECK_RESULT}" > ${SCRIPT_DIR}/last_check_result
    echo "$(date +%T) 更新確認 ※時刻:${CHECK_RESULT}"  >> ${LOG}
  fi
fi
echo "$(date +%T) 処理終了" >> ${LOG}

```


## その他