Как запустить скрипт, когда каталог изменяется другим пользователем?
Я знаю, что была небольшая дискуссия на темы, подобные этой. Но вот что я в основном пытаюсь сделать.
У меня есть каталог под названием watched
и всякий раз, когда файл добавляется в этот каталог, я хочу вызвать скрипт с именем syncbh.sh
который возьмет файлы из этого каталога и загрузит их на удаленный сервер.
Предостережение заключается в том, что файлы создаются в watched
каталог одним пользователем (user2), но скрипт выполняется другим (user1).
Я пытался использовать incron для достижения этой цели, но продолжаю сталкиваться с серьезной проблемой, потому что, хотя скрипт может быть выполнен вручную пользователем user1 с привилегиями root, демон incron фактически никогда автоматически не запускается событием создания файла другим пользователем2.
Я думал о том, будет ли inoticoming лучшей альтернативой, но мне неясно, как работает синтаксис этого. Если есть лучший способ сделать это, или если я в конечном итоге использую inoticoming, какой будет синтаксис команды, чтобы попросить его посмотреть /home/user1/watched
каталог и выполнить скрипт /usr/local/bin/syncbh.sh
если файл создан / изменен в этом каталоге?
Любая помощь приветствуется.
3 ответа
С помощью inoticoming
:
Вы можете поставить скрипт в /etc/init.d/
это работает inoticoming
во время загрузки.
Создайте новую папку для хранения
inoticoming
журнал / последнийpid
дляwatched
папка:sudo mkdir -p /var/log/inoticoming/watched/
Создать скрипт
inoticoming_watched
в/etc/init.d/
:
* Не забудьте изменить 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
Пометьте скрипт как исполняемый:
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
,
Прежде всего, установите inoticoming:
sudo apt-get install 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
Процесс работает в фоновом режиме и следит за
/home/user1/watched
Когда файл добавляется или изменяется в этом каталоге, сценарий
/usr/local/bin/syncbh.sh
называется.Параметр для этого скрипта в этом случае
/home/user1/watched/<name_of_changed_or_modified_file>
{}
заменяется именем файла
Прежде всего, скрипт для просмотра 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