Решено: Нужна помощь с простым скриптом

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС для молодых и начинающих системных администраторов.

Модераторы: SLEDopit, Модераторы разделов

saintry
Сообщения: 19

Решено: Нужна помощь с простым скриптом

Сообщение saintry »

[UPDATE] Нашли другое решение, нужна только помощь со скриптом - сообщение в самом низу темы[UPDATE]


Вечер добрый!

Вкратце обрисую проблему.

С помощью curlftpfs на slackware подмонтирована ftp-шара, расположенная на windows-сервере.

Код: Выделить всё

# curlftpfs -o allow_other root:123456@192.168.10.6 /mnt/smb/


* 10 подсеть - просто поднят тоннель.

На slackware крутится firebird, обрабатывающий заявки, поступающие с кпк экспедиторов. Мониторит он папку /mnt/smb (точка монтирования нашей ftp шары). На виндовом сервере (где наша шара) крутится обработка 1С, которая раз в 10 минут вываливает в эту шару десяток файлов. Пока 1С за свой цикл создает эти 10 файлов она кладет перво-наперво в эту папку loc файл пустой, чтобы firebird не начал пережевывать эти файлы до их полной выгрузки в шару. Как только все файлы выгружены, обработка 1С удаляет loc файл и firebird обрабатывает эти файлы, создав перед этим свой loc файл. Обработал - файл удалил и оставил в шаре свой файлик выгрузки (1 шт), который обработка 1С через 10 минут съедает и начинает свою работу, по окончании которой в шаре оказывается десяток ее файлов. Цикл закончен.

Раньше оба эти сервера жили на одном гипервизоре и находились в одной подсети. Шара монтировалась не как удаленный ftp ресурс, а просто по самбе. Сервера сейчас физически разъехались, по самбе шару теперь не поднять из-за слабого канала - она просто отваливается ежеминутно.

Когда я делаю обмен вручную - монтирую шару по фтп, копирую с помощью mc файлы в папку /mnt/smb, firebird их съедает и отдает свой файл, который я закидываю назад в шару.

При копировании этого файла из линукса, mc копирует его, но при этом ругается на

Изображение

но файл при этом копирует

не могу разобраться - то ли прав доступа не хватает, то ли еще что-то.

Результатом этой несостыковки выходит то, что firebird не может создать свой loc файл в шаре и выполнить свою обработку (под рутом я свободно создаю и удаляю файлы в подмонтированной ftp-шаре)

При подключении шары по самбе такой проблемы не было.

Что я делал:
1. Назначил права 777 на /mnt/smb
2. Назначил в виндовом ftp-сервере для ftp-юзера максимальные права пользователя (user-pass те же, что и рут на линуксе)
3. На виндовой шаре так же доступ дал полный для everyone

Та же ругань.

Лог firebird говорит

Ошибка создания файла блокировки данных.

То есть он не может в примонтированной ftp-шаре создать файл. Хотя я сам под рутом - могу!

***

Насколько я понимаю, нужно понять под каким пользователем firebird (или java, с которой он работает) выполняет свои операции с файлами и монтировать шару с полными правами для этого пользователя?

Как это сделать? =)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Решено: Нужна помощь с простым скриптом

Сообщение drBatty »

saintry писал(а): ↑
07.06.2012 21:55
При копировании этого файла из линукса, mc копирует его, но при этом ругается на

"операция не позволяется" говорит о том, что в данной файловой системе в принципе невозможно менять владельца, например это FAT.
saintry писал(а): ↑
07.06.2012 21:55
Насколько я понимаю, нужно понять под каким пользователем firebird (или java, с которой он работает) выполняет свои операции с файлами и монтировать шару с полными правами для этого пользователя?

дык вы просто монтируйте от юзера, и от него же запускайте firebird. Тогда проблем не будет.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
saintry
Сообщения: 19

Re: Решено: Нужна помощь с простым скриптом

Сообщение saintry »

Не могу разобраться, от какого линуксового юзера инициируется создание loc-файла. В этом затык =(

Перебрал всех пользователей в passwd, вручную из-под любого из них могу создавать файлы в подмонтированной шаре. Но лог линуксовой обработки все равно говорит "Ошибка создания файла блокировки данных." Если же просто закидывать файлы выгрузки из 1С вручную в папку, которую мониторит линуксовая обработка, то в ней сразу создается этот loc файл, запускается обработка и создается файл выгрузки. А когда эта папка подмонтирована как ftp-шара - ни в какую =(

т.е. пока /mnt/smb является просто папкой линукса - все работает, если же ее указать точкой монтирования ftp ресурса - все стопорится.

когда эта же папка монтировалась самбой - все было ок
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Решено: Нужна помощь с простым скриптом

Сообщение drBatty »

saintry писал(а): ↑
08.06.2012 13:02
Не могу разобраться, от какого линуксового юзера инициируется создание loc-файла.

ну дык посмотрите, top/htop/ps uax к вашим услугам. Приложение, которое работает от юзера vasja в принципе не может менять владельца файла, и вообще создавать файлы с другим хозяином. Т.к. обычно при редактировании новый файл заменяет старый, то владельца тоже файл меняет автоматически.
saintry писал(а): ↑
08.06.2012 13:02
А когда эта папка подмонтирована как ftp-шара - ни в какую =(

Чем и как монтируете?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
Atolstoy
Сообщения: 1655
Статус: Tux in the rain
ОС: Linux x86_64

Re: Решено: Нужна помощь с простым скриптом

Сообщение Atolstoy »

Добавь себя в группы ftp и samba.
Всего лишь 26 литров пива достаточно человеку для удовлетворения ежедневной потребности в кальции. Здоровое питание - это так просто!
http://atolstoy.wordpress.com
Спасибо сказали:
saintry
Сообщения: 19

Re: Решено: Нужна помощь с простым скриптом

Сообщение saintry »

Спасибо за ответы, много чего перепробовали и нашли более простой путь)

Единственное, нужна помощь со скриптом:

Ручной запуск скрипта (/mnt/hd - подмонтированая curl-ом ftp-шара)

Код: Выделить всё

#!/bin/sh
echo 1 > /mnt/smb/1c.loc # имитируем блокирование 1с-кой своих файлов во время обработки
cp /mnt/hd/*.* /mnt/smb/ # готовим их к обработке jav-ой
rm /mnt/smb/1c.loc # отдаем jave файлы
sleep 30 # ждем пока java отработает
cp /mnt/smb/orders.xml /mnt/hd/ # отдаем результат работы java 1с-ке


Все работает вручную, но:

Нужно теперь добавить перед этим две проверки - скрипт должен начать выполняться только при соблюдении двух условий:

1. В папке /mnt/hd НЕ должно быть файла orders.xml
2. В папке /mnt/hd НЕ должно быть файла 1с.loc

Если этих двух файлов нет - должно выполниться

Код: Выделить всё

#!/bin/sh
echo 1 > /mnt/smb/1c.loc
cp /mnt/hd/*.* /mnt/smb/
rm /mnt/smb/1c.loc
sleep 30
cp /mnt/smb/orders.xml /mnt/hd/


Если проверка закончилась неудачей (один или оба файла в /mnt/hd присутствуют) - нужно подождать 2 минуты и заново запустить проверку, при успехе которой - выполнить скрипт.

Необходимо теперь упаковать это все в один скрипт и запихнуть его в крон.

Чуть-чуть добить осталось, прошу помощи =)
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Решено: Нужна помощь с простым скриптом

Сообщение sgfault »

saintry писал(а): ↑
09.06.2012 12:18
Если проверка закончилась неудачей (один или оба файла в /mnt/hd присутствуют) - нужно подождать 2 минуты и заново запустить проверку, при успехе которой - выполнить скрипт.

Если вам нужна просто циклическая проверка (бесконечный цикл), то можете сделать как-то так

Код: Выделить всё

while [ -f "/mnt/hd/1c.loc" -o -f "/mnt/hd/orders.xml" ]; do sleep 120; done

Цикл завершится, когда обоих файлов не будет, и, соответственно, выполнение скрипта продолжится.
Спасибо сказали:
saintry
Сообщения: 19

Re: Решено: Нужна помощь с простым скриптом

Сообщение saintry »

Нужно чтобы скрипт выполнялся раз в 15 минут, если проверка не прошла, ожидание две минуты - опять проверка (через 2 минуты уже точно проверка пройдет) и выполнение. Через 15 минут заново. Как-то так.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Решено: Нужна помощь с простым скриптом

Сообщение drBatty »

saintry писал(а): ↑
09.06.2012 12:38
Нужно чтобы скрипт выполнялся раз в 15 минут, если проверка не прошла, ожидание две минуты - опять проверка (через 2 минуты уже точно проверка пройдет) и выполнение. Через 15 минут заново. Как-то так.

man crontab, уже Over9000 тем на эту тему.
задержку на 2 минуты можно сделать так: sleep 2m.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
saintry
Сообщения: 19

Re: Решено: Нужна помощь с простым скриптом

Сообщение saintry »

C кроном я разберусь, думаю (про выполнение раз в 15 минут).

С самим телом скрипта выходит так?

Код: Выделить всё

#!/bin/sh
if [ -f "/mnt/hd/1c.loc" -o -f "/mnt/hd/orders.xml" ]
sleep 120
echo 1 > /mnt/smb/1c.loc
cp /mnt/hd/*.* /mnt/smb/
rm /mnt/smb/1c.loc
sleep 30
cp /mnt/smb/orders.xml /mnt/hd/
fi


Или напутал что?
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Решено: Нужна помощь с простым скриптом

Сообщение sgfault »

saintry писал(а): ↑
09.06.2012 13:03
С самим телом скрипта выходит так?

Код: Выделить всё

#!/bin/sh
if [ -f "/mnt/hd/1c.loc" -o -f "/mnt/hd/orders.xml" ]
sleep 120
echo 1 > /mnt/smb/1c.loc
cp /mnt/hd/*.* /mnt/smb/
rm /mnt/smb/1c.loc
sleep 30
cp /mnt/smb/orders.xml /mnt/hd/
fi


Или напутал что?

Вы написали следующее: если существует один из файлов, вы входите в if, ждете 120 секунд и выполняете остальные операции, _не_ повторив проверку. И, кроме того, пропустили then после ].

Upd. Немного переформулировал.
Спасибо сказали:
saintry
Сообщения: 19

Re: Решено: Нужна помощь с простым скриптом

Сообщение saintry »

и выполняете остальные операции, _не_ повторив проверку


[upd] наврал я.

Тогда такой вариант пойдет?

Код: Выделить всё

#!/bin/sh
if [ -f "/mnt/hd/1c.loc" -o -f "/mnt/hd/orders.xml" ]
then
sleep 120
else
echo 1 > /mnt/smb/1c.loc
cp /mnt/hd/*.* /mnt/smb/
rm /mnt/smb/1c.loc
sleep 30
cp /mnt/smb/orders.xml /mnt/hd/
fi


Блин. Ждем 120 секунд и... Что у меня выходит после? Блин.
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Решено: Нужна помощь с простым скриптом

Сообщение drBatty »

saintry писал(а): ↑
09.06.2012 13:03
if [ -f "/mnt/hd/1c.loc" -o -f "/mnt/hd/orders.xml" ]
sleep 120

тогда уж
if [ условиие ]; then
sleep 2m
fi
# а тут у вас вроде точно условие НЕ выполниться.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Решено: Нужна помощь с простым скриптом

Сообщение sgfault »

saintry писал(а): ↑
09.06.2012 13:32
и выполняете остальные операции, _не_ повторив проверку


А если я точно уверен, что через 120 секунд повторная проверка не потребуется? (там в реальности, при существовании любого из этих файлов, их не будет в папке спустя секунд 40-50)

Тогда такой вариант пойдет?

Код: Выделить всё

#!/bin/sh
if [ -f "/mnt/hd/1c.loc" -o -f "/mnt/hd/orders.xml" ]
then
sleep 120
echo 1 > /mnt/smb/1c.loc
cp /mnt/hd/*.* /mnt/smb/
rm /mnt/smb/1c.loc
sleep 30
cp /mnt/smb/orders.xml /mnt/hd/
fi


Не совсем. Если файлов нету сразу (как только скрипт был запущен), то операции не будут выполнены. Те, тк у вас операции внутри if-а, то они выполняются только, когда выполняется if. А if выполняется только, если один из файлов существует. Те то, что вы, как я понимаю, хотите - в случае существования файлов подождать 120 секунд и выполнить операции, в случае отутсутствия - выполнить сразу, будет выглядеть так:

Код: Выделить всё

#!/bin/sh
if [ -f "/mnt/hd/1c.loc" -o -f "/mnt/hd/orders.xml" ]
then
sleep 120
fi
echo 1 > /mnt/smb/1c.loc
cp /mnt/hd/*.* /mnt/smb/
rm /mnt/smb/1c.loc
sleep 30
cp /mnt/smb/orders.xml /mnt/hd/


Upd.И еще, на всякий случай:
1. Несмотря на то, что вы уверены, что файлов там не будет через 120с, как-то раз, если что-то пойдет не так, они могут там оказаться. Другими словами, не повторять проверку, мне кажется, неправильно.
2. Говорят, что лучше включать 'errexit', "на всякий пожарный" :huh: Те добавить что-то такое в начало скрипта
Спасибо сказали:
saintry
Сообщения: 19

Re: Решено: Нужна помощь с простым скриптом

Сообщение saintry »

Я отредактировал свое последнее пока думал, посмотрите, пожалуйста. Файл orders.xml может лежать до 10 минут включительно, пока не исчезнет. А 1c.loc - да, секунд 40 максимум.

Код: Выделить всё

#!/bin/sh
if [ -f "/mnt/hd/1c.loc" -o -f "/mnt/hd/orders.xml" ]
then
sleep 120
fi
echo 1 > /mnt/smb/1c.loc
cp /mnt/hd/*.* /mnt/smb/
rm /mnt/smb/1c.loc
sleep 30
cp /mnt/smb/orders.xml /mnt/hd/


Нужно все таки после 120 секунд проверить еще раз.
Спасибо сказали:
Аватара пользователя
sgfault
Сообщения: 586
Статус: -

Re: Решено: Нужна помощь с простым скриптом

Сообщение sgfault »

Тут есть два варианта: либо бесконечный цикл (можно еще считать проходы и через какое-то к-во выходить с ошибкой), либо inotify :happy:
Цикл я вам уже писал выше. Вместо if-a надо написать что-то такое (я заменил -f на -e на случай, если 1c.loc и orders.xml случайно окажутся не файлами)

Код: Выделить всё

while [ -e "/mnt/hd/1c.loc" -o -e "/mnt/hd/orders.xml" ]; do
    sleep 120
done

Если вы хотите считать проходы цикла, то как-то так (строковое сравнение для числа, но все равно должно работать нормально)

Код: Выделить всё

iter_max=10
while [ -e "/mnt/hd/1c.loc" -o -e "/mnt/hd/orders.xml" ]; do
    if [ "$iter_max" = 0 ]; then
        echo "Timed out"
        exit 1
    fi
    sleep 120
    iter_max=$((iter_max - 1))
done

Если вы хотите использовать inotify , то вот такие два варианта.

Код: Выделить всё

while [ 1 ]; do
    if [ -f "/mnt/hd/1c.loc" ]; then
        inotifywait -e delete_self "/mnt/hd/1c.loc"
        continue
    fi
    if [ -f "/mnt/hd/orders.xml" ]; then
        inotifywait -e delete_self "/mnt/hd/orders.xml"
        continue
    fi
    break
done

Или такой

Код: Выделить всё

wait_for_file()
{
    if [ -f "$1" ]; then
        inotifywait -e delete_self "$1"
        return 1
    fi
    return 0
}

while [ 1 ]; do
    wait_for_file "/mnt/hd/1c.loc"      || continue
    wait_for_file "/mnt/hd/orders.xml"  || continue
    break
done

В первом варианте с inotify, если у вас включен errexit, то скрипт завершится, если inotify вернет не 0 (те, все как и должно быть). Во втором, ошибка в inotify приведет к повторной попытке.

Upd. Ну, если вы абсолютно уверены, что 3-я проверка не понадобится, то можно без всех этих циклов - просто повторить if еще раз.
Upd2. И еще, если случайно 1c.loc или orders.xml окажутся симлинками, то проверка будет работать неправильно. Если это нужно, ее надо еще немного изменить.
Upd3. Вариант с inotify можно записать еще короче:

Код: Выделить всё

while [ 1 ]; do
    inotifywait -e delete_self "/mnt/hd/1c.loc"     && continue
    inotifywait -e delete_self "/mnt/hd/orders.xml" && continue
    break
done >/dev/null 2>&1

Но такой вариант, как и все предыдущие, будет следовать симлинкам. Те в случае симлинка проверяться будет файл, на который он указывает, а не сам симлинк.
Upd4.И, наконец, вот версия первого варианта (бесконечный цикл), который работает даже с симлинками (если 1с.loc или orders.xml оказывается симлинком, то проверяется существование самого симлинка, а не файла, на который он указывает):

Код: Выделить всё

while [ -h "/mnt/hd/1c.loc" -o -e "/mnt/hd/1c.loc" -o -h "/mnt/hd/orders.xml" -o -e "/mnt/hd/orders.xml" ]; do
    sleep 120
done
Спасибо сказали:
saintry
Сообщения: 19

Re: Решено: Нужна помощь с простым скриптом

Сообщение saintry »

Фух, все!

Достаточным оказалось

Код: Выделить всё

#!/bin/sh
if [ -f "/mnt/hd/1c.loc" -o -f "/mnt/hd/orders.xml" ]
then
exit
fi
echo 1 > /mnt/smb/1c.loc
cp /mnt/hd/*.* /mnt/smb/
rm /mnt/smb/1c.loc
sleep 30
cp /mnt/smb/orders.xml /mnt/hd/


И

Код: Выделить всё

# crontab -e
*/2 * * * * /script.sh
:wq!
#


Спасибо всем тем, кто принимал в этом участие, начиная с curlftpfs и заканчивая скриптом!

опыт для меня был бесценным, было очень интересно)
Спасибо сказали: