#!/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