Можно в начале работы скрипта создать lock-файл вида <имя_скрипта>.<PID_скрипта>, командой touch "`basename $0`.$$", предварительно проверив следующие условия:
1. Наличие lock-файла.
2. Наличие процесса с PID, совпадающим с указанным в имени lock-файла.Если условие 1 ложно - значит, нет еще одного экземпляра нашего скрипта; создаем lock-файл и работаем дальше.
Если условие 1 истинно, а условие 2 ложно - значит предыдущий сеанс работы скрипта завершился аварийно и lock-файл не удален; удаляем, создаем новый, работаем дальше. (Примечание: следует в скрипт вставить перехват прерываний и в обработке оных вставить удаление lock-файла. Штатное завершение скрипта тоже можно провести через этот обработчик.)
Если истинны оба условия - значит скрипт еще работает, завершаем работу.
Вот примерно так оно и делается...
---------------------------------------------------
#!/bin/bash
trap "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 ложно
then
LOCKFILE="`basename $0`.$$"
touch $LOCKFILE
ls -l $LOCKFILE
elif [ "$LOCKFILE" != "" ]; # Условие 1 истинно
then
PID=`ls $LOCKFILE | awk -F. '{print $NF}'`
if [ "`ps -ef | grep $PID | grep -v grep`" == "" ]; # Условие 2 ложно
then
rm $LOCKFILE
LOCKFILE="`basename $0`.$$"
touch $LOCKFILE
else
echo "This script is still working"
exit 1
fi
fi
# "Рабочая" часть скрипта
while :;
do
continue
done
# Нормальное завершение работы
my_exit
-----------------------------------------------------
Только что написал и проверил. Работает.