「このプログラムもう何時間動いてるんだ。。。」を調べる & tmux で表示できるようにする

More than 1 year has passed since last update.

サーバを使って実験をしていると、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))\""