singletask.sh

#!/bin/sh

PATH=.:$PATH
export PATH

THIS_PID=`echo $$`
THIS_NAME=$0
PID_FILE=default.pid
OUT_FILE=nohup.out
while [ TRUE ]
do
        if [ "$1" = "-pid" ]
        then
                PID_FILE=$2
                if [ "$2" != "" ]
                then
                        shift 2
                fi
                continue
        fi
        if [ "$1" = "-out" ]
        then
                OUT_FILE=$2
                if [ "$2" != "" ]
                then
                        shift 2
                fi
                continue
        fi
        break
done
CMD_LINE=$*

if [ "$CMD_LINE" = "" ]
then
        echo "cmd like :$THIS_NAME [-pid def.pid] [-out nohup.out] cmd paramlist"
        exit
fi

PREV_PID=
if [ -f "$PID_FILE" ]
then
        read PREV_PID < $PID_FILE
        GREP_STR=`ps -ef -o pid | grep $PREV_PID`
        if [ "$GREP_STR" != "" ]
        then
                echo "process has been running in memory!"
                exit
        fi
fi

# begin command
date '+DATETIME: %Y/%m/%d %H:%M:%S' >> $OUT_FILE
nohup $CMD_LINE >> $OUT_FILE &
sleep 1
# end command

SUB_PID_SET=
NEW_PPID_SET=$THIS_PID

while [ TRUE ]
do
        NEXT_PPID_SET=
        for ii in $NEW_PPID_SET
        do
                TMP_PID_SET=`ps -ef -o pid,ppid | grep $ii | awk '{printf "%s\n",$1 }'`
                for jj in $TMP_PID_SET
                do
                        TMP_VAL=`ps -ef -o pid | grep $jj`
                        if [ "$TMP_VAL" = "" ]
                        then
                                continue
                        fi
                        if [ "$jj" != "$ii" ]
                        then
                                SUB_PID_SET=$SUB_PID_SET" "$jj
                                NEXT_PPID_SET=$NEXT_PPID_SET" "$jj
                        fi
                done
        done
        NEW_PPID_SET=$NEXT_PPID_SET
        if [ "$NEW_PPID_SET" = "" ]
        then
                break
        fi
done

END_PPID_LIST=`ps -ef -o ppid`

for ii in $SUB_PID_SET
do
        TEST_VAL=
        for jj in $END_PPID_LIST
        do
                if [ "$ii" = "$jj" ]
                then
                        TEST_VAL=$ii
                        break
                fi
        done
        if [ "$TEST_VAL" != "" ]
        then
                continue
        fi
        echo $ii > $PID_FILE
        exit
done

猜你喜欢

转载自www.cnblogs.com/wzh313/p/9124502.html
.sh
SH