Как запустить скрипт, когда каталог изменяется другим пользователем?

Я знаю, что была небольшая дискуссия на темы, подобные этой. Но вот что я в основном пытаюсь сделать.

У меня есть каталог под названием 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 во время загрузки.

  1. Создайте новую папку для хранения inoticoming журнал / последний pid для watched папка: sudo mkdir -p /var/log/inoticoming/watched/

  2. Создать скрипт 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
  1. Пометьте скрипт как исполняемый: sudo chmod u+x /etc/init.d/inoticoming_watched

  2. Убедитесь, что скрипт вызван inoticoming_watched является исполняемым

  3. Обновить 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
Другие вопросы по тегам