Я написал свой первый 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
Сценарий Unix Bash запускается несколько раз даже с файлом PID ⇐ Php
Кемеровские программисты php общаются здесь
-
Anonymous
1719765988
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 <
Подробнее здесь: [url]https://stackoverflow.com/questions/41718650/unix-bash-script-starts-multiple-times-even-with-pid-file[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия