Сценарий Unix Bash запускается несколько раз даже с файлом PIDPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Сценарий Unix Bash запускается несколько раз даже с файлом PID

Сообщение Anonymous »

Я написал свой первый bash-скрипт, который проверяет папки на наличие изменений с помощью функции «inotify» и запускает какие-то действия. Весь процесс является фоновым процессом.
Эта папка является местом назначения нескольких регистраторов данных, которые помещают файлы в формате zip через FTP в разные подпапки. Скрипт bash разархивирует файлы и после этого запускает php-скрипт, который обрабатывает содержимое zip-файлов.
Моя проблема: иногда сценарий bash выдает ошибки, подобные следующим:< /p>
- No zipfiles found.
- unzip: cannot find zipfile...

Этого не должно произойти, поскольку файлы существуют, и я могу без ошибок запустить ту же команду в терминале. Раньше у меня была такая же проблема, когда я случайно запускал сценарий несколько раз, поэтому я думаю, что это каким-то образом вызывает проблему.
Я пытался решить проблему с помощью PID-файла, который находится в моем домашнем каталоге. По какой-то причине он по-прежнему запускает два экземпляра сценария bash. Если я попытаюсь запустить другой экземпляр, он отобразит предупреждение «Процесс уже запущен», как и должно быть (см. Код программы). Когда я вручную уничтожаю процесс второго экземпляра (kill $$), он перезапускается через некоторое время, и снова выполняются два экземпляра процесса.
#!/bin/bash

PIDFILE=/home/PIDs/myscript.pid

if [ -f $PIDFILE ]
then
PID=$(cat $PIDFILE)
ps -p $PID > /dev/null 2>&1
if [ $? -eq 0 ]
then
echo "Process already running"
exit 1
else
## Process not found assume not running
echo $$ > $PIDFILE
if [ $? -ne 0 ]
then
echo "Could not create PID file"
exit 1
fi
fi
else
echo $$ > $PIDFILE
if [ $? -ne 0 ]
then
echo "Could not create PID file"
exit 1
fi
fi

while true;
do inotifywait -q -r -e move -e create --format %w%f /var/somefolder | while read FILE

do
dir=$(dirname $FILE)
filename=${FILE:$((${#dir}+1))}

if [[ "$filename" == *.zip ]];
then
unzip $FILE
php somephpscript $dir
fi
done
done

Вывод команды ps -ef выглядит следующим образом:
UID PID PPID C STIME TTY TIME CMD

root 1439 1433 0 11:19 pts/0 00:00:00 /bin/bash /.../my_script
root 3488 1439 0 15:10 pts/0 00:00:00 /bin/bash /.../my_script

Как видите, второй экземпляр Parent-PID — это сам сценарий.
РЕДАКТИРОВАТЬ: я изменил сценарий bash, как рекомендовал Фред. Исходный код теперь выглядит так:
#!/bin/bash

PIDFILE=/home/PIDs/myscript.pid

if [ -f $PIDFILE ]
then
PID=$(cat $PIDFILE)
ps -p $PID > /dev/null 2>&1
if [ $? -eq 0 ]
then
echo "Process already running"
exit 1
else
## Process not found assume not running
echo $$ > $PIDFILE
if [ $? -ne 0 ]
then
echo "Could not create PID file"
exit 1
fi
fi
else
echo $$ > $PIDFILE
if [ $? -ne 0 ]
then
echo "Could not create PID file"
exit 1
fi
fi

while read -r FILE
do
dir=$(dirname $FILE)
filename=${FILE:$((${#dir}+1))}

if [[ "$filename" == *.zip ]];
then
unzip $FILE
php somephpscript $dir
fi

done <

Подробнее здесь: https://stackoverflow.com/questions/417 ... h-pid-file
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»