Я знаю, что была небольшая дискуссия на темы, подобные этой. Но вот что я в основном пытаюсь сделать.
У меня есть контрольный каталог watched
, и всякий раз, когда файл добавляется в этот каталог, я хочу запустить скрипт под названием syncbh.sh
, который будет извлекать файлы из этого каталога и загружать их на удаленный сервер.
Предостережение заключается в том, что файлы создаются в каталоге watched
одним пользователем (user2), но скрипт выполняется другим пользователем (user1).
Я пытался использовать incron для достижения этой цели, но продолжаю сталкиваться с серьезной проблемой, потому что, хотя сценарий может быть выполнен вручную пользователем user1 с привилегиями root, демон incron является фактически никогда автоматически не запускается событием создания файла другим пользователем2.
Я думал о том, будет ли inoticoming лучшей альтернативой, но мне неясно, как работает синтаксис этого. Если есть лучший способ сделать это, или если я в конечном итоге использую inoticoming , каков будет синтаксис команды, чтобы попросить его посмотреть каталог /home/user1/watched
и выполнить скрипт /usr/local/bin/syncbh.sh
, если файл создан / Изменено в этом каталоге?
Любая помощь будет высоко ценится.
В первую очередь, сценарий для наблюдения watched
каталог:
#! /bin/bash
folder=/path-to-watched
inotifywait -m -q -e create -e modify '%:e %w%f' $folder | while read file
do
#make the sync here
done
Второй Для создания синхронизации как другого пользователя (user2):
sudo -H -u user2 bash -c 'sh /usr/local/bin/syncbh.sh '
Теперь для не создания пользовательской подсказки, можно установить Ваш sudo
пароль в файле и читал, пароль из этого файла при необходимости (обратите внимание, что необходимо использовать -S
с sudo
получить пароль из файла).
Поместите Ваш sudo
пароль в файле, предположить passwd.txt
, затем команда выше будет, сосут как
sudo -S -H -u user2 bash -c 'sh /usr/local/bin/syncbh.sh ' < /path-to/passwd.txt
Теперь полный сценарий будет похож:
#! /bin/bash
folder=/path-to-watched
inotifywait -m -q -e create -e modify '%:e %w%f' $folder | while read file
do
sudo -S -H -u user2 bash -c 'sh /usr/local/bin/syncbh.sh ' < /path-to/passwd.txt
done
В первую очередь, установите inoticoming:
sudo apt-get install inoticoming
Затем использование эта команда:
Обращают внимание на продолжающиеся процессы inoticoming, потому что они могут быть запущены многократно.
$ inoticoming /home/user1/watched /usr/local/bin/syncbh.sh /home/user1/watched/{} \;
^ ^ ^
| | |
^-- The directory to be monitored |
| |
^-- Your script |
^-- The parameter for your script
процесс работает в backgound и смотрит /home/user1/watched
, Когда файл добавляется или изменяется в том каталоге, сценарий /usr/local/bin/syncbh.sh
называют.
параметр для этого сценария в этом случае /home/user1/watched/<name_of_changed_or_modified_file>
{}
, заменяется именем файла
Используя inoticoming
:
Можно вставить сценарий /etc/init.d/
это работает inoticoming
во время начальной загрузки.
Создайте новую папку для содержания inoticoming
зарегистрируйтесь / в последний раз pid
для watched
папка: sudo mkdir -p /var/log/inoticoming/watched/
Создайте сценарий inoticoming_watched
в /etc/init.d/
:
* Не забывают изменяться <path_to_folder> и <path_to_script> для соответствия полному пути watched
папка и полный путь сценария для выполнения
#!/bin/sh
case "${1}" in
start)
inoticoming --logfile '/var/log/inoticoming/watched/inoticoming.log' --pid-file '/var/log/inoticoming/watched/inoticoming_last_pid.txt' <path_to_folder> <path_to_script> \;
;;
stop)
kill -15 $(< /var/log/inoticoming/watched/inoticoming_last_pid.txt tee)
;;
restart)
${0} stop
sleep 1
${0} start
;;
*)
echo "Usage: ${0} {start|stop|restart}"
exit 1
;;
esac
Mark сценарий как исполняемый файл: sudo chmod u+x /etc/init.d/inoticoming_watched
Удостоверьтесь что сценарий, названный inoticoming_watched
исполняемый файл.
Обновление rc.d
сделать сервис inoticoming_watched
запустите во время начальной загрузки: sudo update-rc.d inoticoming_watched defaults
Можно проверить inoticoming
авторизоваться /var/log/inoticoming/watched
.