「이 프로그램 벌써 몇 시간동안 하고 있어...」를 조사한다 & tmux 로 표시할 수 있도록(듯이) 한다

5572 단어 tmuxprocess리눅스


서버를 사용해 실험을 하고 있으면, 1회 실행하는데 몇 시간이 걸리는 프로그램을 여러가지 쓰면서 몇번이나 실행해 데이터를 취하거나 하는 것이 자주 있다. 그 때에 타임 스탬프 표시를 넣는 것을 잊거나 하면, 실행을 시작하고 나서 상당히 시간이 지난 후에, 「어라, 이 프로그램 언제부터 실행하고 있는 거야? 예측도 할 수 없구나,,,」라고 하는 것이 자주 있다.

이런 프로그램은 주로 tmux의 안쪽에서 움직이고 있기 때문에, tmux의 키 바인드로부터 빨리 확인할 수 있으면 기뻤기 때문에, 그런 것을 만들었다. 지금은 리눅스에서만 움직이지만, 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))\""

좋은 웹페이지 즐겨찾기