次のジョブのすべてのファイルを深夜に同時に削除したい
0 0 * * * root [[ -d /var/log/ambari-metrics-collector ]] && find /var/log/ambari-metrics-collector -type f -mtime +10 -regex '.*\.log.*[0-9]$' -delete
0 0 * * * root [[ -d /var/log/kO ]] && find /var/log/Ko -type f -mtime +10 -regex '.*\.log.*[0-9]$' -delete
0 0 * * * root [[ -d /var/log/POE ]] && find /var/log/POE -type f -mtime +10 -regex '.*\.log.*[0-9]$' -delete
0 0 * * * root [[ -d /var/log/REW ]] && find /var/log/REW -type f -mtime +10 -regex '.*\.log.*[0-9]$' -delete
それからすべてを同時に実行しても大丈夫ですか?
用量cronジョブはそれらを段階的に実行しますか?または両方とも同じスレッドにありますか?
はい、cron
が同時に複数のジョブをスケジュールすることは完全に許容されます。
ただし、コンピューターはnothingを同時に実行し、cron
テーブルに存在する順序で起動されます。ただし、それらは順番に実行されません。それらは、真夜中から数ミリ秒以内に次々に開始されます-すべての実用的な目的のために同時に。
Cronは、すべてのジョブをほぼ同時に開始し、同時に実行します。
ただし、このようなクリーンアップジョブの場合は、短いシェルスクリプトを記述して、プロシージャを順番に実行することをお勧めします。これにより、複数のfind
の実行が互いに遅くなるのを防ぐことができます(そして、システムの残りの部分でのディスクアクセスが少し遅くなる可能性があります)。また、cron仕様を変更する(またはmoreを追加する)ことなく、クリーンアップ手順の変更/更新(たとえば、新しいディレクトリの追加やfind
基準の変更など)を簡単に行うことができます。 =クリーンアップジョブ)。
例えば、
#!/bin/bash
for dir in /var/log/{ambari-metrics-collector,k0,POE,REW}; do
[ ! -d "$dir" ] && continue
find "$dir" -type f -mtime +10 -regex '.*\.log.*[0-9]$' -delete
done
あるいは単に
#!/bin/bash
find /var/log/{ambari-metrics-collector,k0,POE,REW} -type f -mtime +10 -regex '.*\.log.*[0-9]$' -delete
(これらのディレクトリの1つまたは複数が存在しない場合にもエラーが発生し、知るのに役立つ場合とそうでない場合があります)
次に、システムで適切な方法でcronを使用してこのスクリプトの実行をスケジュールします。
少し凝った:
#!/bin/bash
# directories to clean up
dirs=( /var/log/ambari-metrics-collector
/var/log/k0
/var/log/POE
/var/log/REW
)
for dir in "${dirs[@]}"; do
if [ ! -d "$dir" ]; then
printf 'Dir "%s" does not exist, check this!\n' "$dir" >&2
else
printf 'Removing files from "%s":\n' "$dir"
find "$dir" -type f -mtime +10 -regex '.*\.log.*[0-9]$' -print -delete
fi
done
または、このアプローチを完全に廃止し、logrotate
または同様のソフトウェアを使用して、代わりにログファイルのメンテナンスを適切に行います。
Cronは、4つのプロセスすべてを深夜に並行して開始します。