
サーバを使って実験をしていると、1回実行するのに数時間かかるプログラムを色々と書きながら何度も実行してデータを取ったりということがよくある。そのときに、タイムスタンプ表示を仕込むのを忘れたりすると、実行し始めてから随分時間が経った後に、「あれ、このプログラムいつから実行してるんだっけ?開始時刻がわからないからあと何時間で終わるか予測もできないな、、、」ということがよくある。
こういうプログラムは大抵tmuxの内側で動かしているので、tmuxのキーバインドからサッと確認できると嬉しいので、そのようなものを作った。今のところLinuxでしか動かないけど、OS X の ps
コマンドに合わせて修正を加えれば OS X でも動くはず。
シェルが実行中のプロセスを調べるコマンド
~/usr/bin/childpidinfo
とか名前をつけて下記のスクリプトを保存する。
こいつは、引数でプロセスのPIDを指定して、そのプロセスの子プロセスの中で最も新しいプロセスに関して、開始時刻と実行時間を表示するコマンドになっている。tmuxで開いているシェルのPIDを渡してやることで、結果として実行中のプロセスを調べることができる。カスタマイズすれば、時刻以外にも、やろうと思えばCPU使用率とかメモリ使用率とかps
で取れるものはなんでも表示可能。
# !/bin/bash
if [ $# -lt 1 ]; then
echo "[ERROR] usage: $0 PARENT_PID"
exit 1
fi
LAST_CHILD_PID=$(for pid in $(ps --ppid $1 -o pid= | tr -d ' '); do
STARTTIME_SEC=$(date -d "`ps --pid $pid -o lstart=`" +%s)
echo $pid $STARTTIME_SEC
done | sort -k2 | tail -n1 | cut -d' ' -f1)
if [ -z "$LAST_CHILD_PID" ]; then
echo "No child process is running."
exit
fi
STARTTIME_SEC=$(date -d "`ps --pid $LAST_CHILD_PID -o lstart=`" +%s)
STARTTIME=$(date -d @${STARTTIME_SEC} +"%Y/%m/%d %H:%M:%S")
DURATION_SEC=$(($(date +%s)-STARTTIME_SEC))
DURATION=$(date --utc -d @${DURATION_SEC} +%kh%Mm%Ss | sed -e 's/^ \(0h\)?*//' | sed -e 's/^00*m//' | sed -e 's/^0//')
echo "[PID:$LAST_CHILD_PID] started at $STARTTIME (running $DURATION)"
tmux.conf の設定
ここでは <prefix> Shift+P
に割り当てる。
# display-message lasts 4 seconds
set-option -g display-time 4000
bind-key P run-shell "tmux display-message \"$(childpidinfo $(tmux list-panes -F '#{pane_active} #{pane_pid}' | grep '^1' | cut -d' ' -f2))\""