Есть скрипт, который работает по крону. Но может быть такая ситуация, что какой-то запуск скрипта будет при ещё не отработавшем "старом". Такой ситуации быть не должно.Если в скрипте написать (под солярисом):
ps -ef | grep -v grep | grep -с "`basename $0`$"
то он показывает как раз то, что надо, однако при этом не проверишь результат. Но, если сделать так:
BN=`basename $0`
OUT=`ps -ef | grep -v grep | grep -с "${BN}$"`
echo $OUT
То получается "лишний" процесс из-за "подстановки".
Думаю, что как-то надо сюда прикрутить $PPID. Может кто подскажет?
Можно в начале работы скрипта создать lock-файл вида <имя_скрипта>.<PID_скрипта>, командой touch "`basename $0`.$$", предварительно проверив следующие условия:
1. Наличие lock-файла.
2. Наличие процесса с PID, совпадающим с указанным в имени lock-файла.Если условие 1 ложно - значит, нет еще одного экземпляра нашего скрипта; создаем lock-файл и работаем дальше.
Если условие 1 истинно, а условие 2 ложно - значит предыдущий сеанс работы скрипта завершился аварийно и lock-файл не удален; удаляем, создаем новый, работаем дальше. (Примечание: следует в скрипт вставить перехват прерываний и в обработке оных вставить удаление lock-файла. Штатное завершение скрипта тоже можно провести через этот обработчик.)
Если истинны оба условия - значит скрипт еще работает, завершаем работу.
Вот примерно так оно и делается...
---------------------------------------------------
#!/bin/bashtrap "my_exit" 2 9 15 # Перехват сигналов и отправка их на обработку
function my_exit() {
echo "Deleting $LOCKFILE and exiting"
rm $LOCKFILE
exit
}NAME=`basename $0`
LOCKFILE=`ls ${NAME}.* 2>/dev/null`if [ "$LOCKFILE" == "" ]; # Условие 1 ложно
thenLOCKFILE="`basename $0`.$$"
touch $LOCKFILE
ls -l $LOCKFILEelif [ "$LOCKFILE" != "" ]; # Условие 1 истинно
thenPID=`ls $LOCKFILE | awk -F. '{print $NF}'`
if [ "`ps -ef | grep $PID | grep -v grep`" == "" ]; # Условие 2 ложно
thenrm $LOCKFILE
LOCKFILE="`basename $0`.$$"
touch $LOCKFILEelse
echo "This script is still working"
exit 1fi
fi
# "Рабочая" часть скрипта
while :;
do
continue
done# Нормальное завершение работы
my_exit
-----------------------------------------------------Только что написал и проверил. Работает.
Я делал вот так:SCRIPTDIR="/home/jagura/temp/scripts/"
NAME=`basename $0`
BYZA=`ps -ef | grep $NAME | grep -v grep | grep -v $$ | wc -l`
echo $$
if [ "$BYZA" != 0 ]; # found another instance
then
echo FOUND another instance running!
exit
fi
-----
Простенько, и работает безотказно.