2011年5月8日日曜日

xsessionrcのプロセス制御

前回前々回でwhileでループさせた後xsessionで壁紙やらステータスバーを変更してたけど、それだといろいろと不具合があることが分かったので修正する。

修正後のxsessionrcは以下のようになった

#!/bin/bash
#xsetroot -solid DarkSlateBlue
#hsetroot -full /usr/share/lxde/wallpapers/garasunodice.jpg

D_NUM=`echo $DISPLAY  | cut -f 2 -d:`
PIDFILE=~/.xsession_${D_NUM}.pid
for psnum in $(cat $PIDFILE)
do
        cmd=`ps -p $psnum | tail -1 `
        if echo $cmd | grep Xsession > /dev/null ; then
                kill $psnum
        fi
done
rm -f $PIDFILE

while true
        do
        DATE=`date +"%Y/%m/%d %H:%M"`
        LOAD=`loadav.pl`
        xsetroot -name "Load Average:$LOAD   $DATE" || exit
        sleep 30s || exit
done &
echo $! >> $PIDFILE

while true
        do
        /usr/local/bin/random_wallpaper.pl /jitaku/local/pic/Linux_wallpaper/ || exit
        sleep 30m || exit
done &
echo $! >> $PIDFILE

まず不具合の原因はwhileループがXをログオフしても生き続けること
下図参考このように30sの間にログオフ→ログインが行われると2つのプロセスが実行されてしまう
それを防ぐためにwhileのwhileのプロセスを記録しておく
このときディスプレイ番号も記録し他のXセッションも切らないようにする
pstreeでみるとこんな感じ

こうしておけば次にログインするときにWhileプロセスを殺してくれる。whileプロセスが無いので時間が経てば消えるので良しとした
ちなみにこの方法は再起動した時でも前回のプロセス番号をkillしようとするので完全ではない。
たまたま、同じプロセス番号+Xsessionコマンドで実行されていれば間違えてしまう可能性がある

過去記事
Dwmのステータスバーと壁紙を変更してみる
Linuxでランダムに壁紙を変更するスクリプト書いた

0 件のコメント: