タグ別アーカイブ: linux

穏やかな速度でファイルを削除するプログラム gentle_unlink を書いた

おがた (@xtetsuji) です。

Linux サーバ上で作業をしていると、様々な一時ファイルがディスクを圧迫していて、ディスク容量を増やすために削除を行うことがあります。通常であれば rm コマンド一発で終わる単純なファイル操作ですが、ファイルが何百万やそれ以上といったオーダーで大量にあると、削除自体のコストが無視できなくなります。

Linux サーバ管理者の間ではたびたび問題になる大量ファイルの削除操作、各人コマンドを組み合わせて工夫しているようですが、より微調整をしたかった私は Perl を使ってコマンドを書くことにしました。その名も gentle_unlink。

最近はITエンジニアリングネタは Qiita に書くことが多いのですが、自分が書いたまとまったプログラムの紹介ということで、メインブログに書いてみることにしました。

初出の社内勉強会での紹介トーク、そしてスクリプトファイルは以下のリンクからどうぞ。

続きを読む

月末やうるう年を判定して実行するかどうかcronで条件分岐

うるう年にブログを更新するのがアツいという世間の流行に乗せられている おがた です。

特にネタは無いなぁと思いつつ、お仕事からうるう年っぽいネタを出してみます。

シェルスクリプトを「月末に実行する」「毎月29日に実行するけど、うるう年ではない2月の場合は3月1日に実行する」といった要請があって、cronの日付指定だと難しいケースがあります。

そういう時に、月末やうるう年を判定して、それをステータスコードを返して “&&” や “||” で後続のコマンドを実行するかしないか判定するコマンド “end-of-month.sh” と “leap-year.sh” というシェルスクリプトを作ってみました。

#!/bin/bash
# Usage:
#   # crontab: need to run some-command at end-of-month.
#   0 15 28-31 * * end-of-month.sh && some-command

set -o errexit

arg=$1
if [ $(date +%m -d "$arg tomorrow" ) != $(date +%m -d "$arg" ) ] ; then
    exit 0;
else
    exit 1;
fi
#!/bin/bash
# Usage:
#   # crontab: need to run some-command at leap-year or not it.
#   5 18  1 3 * * leap-year.sh || some-command
#   5 18 29 2 * * some-command

set -o errexit

arg=$1
if [ "$arg" ] ; then
    year=$arg
else
    year=$( date +%Y )
fi

if [ $(( $year % 4 )) = 0 ] ; then
    if [ $(( $year % 100 )) = 0 ] ; then
	if [ $(( $year % 400 )) = 0 ] ; then
	    exit 0
	else
	    exit 1
	fi
    else
	exit 0
    fi
else
    exit 1
fi

使い方はソースコードに書いてある通りです。

2月29日中にブログを更新したくて、中野の地下の飲み屋でビールを飲んでおでんを食べながらのブログ更新です。本当なら今日は健康診断だったので、バリウムの都合でアルコールは飲まないようにと言われているのですが。まぁ一杯だけ…。お店の良い雰囲気の中、3月を迎えることになりそうです。でも健康的になるべく早く帰って就寝する予定です。