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

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

У меня есть контрольный каталог watched, и всякий раз, когда файл добавляется в этот каталог, я хочу запустить скрипт под названием syncbh.sh, который будет извлекать файлы из этого каталога и загружать их на удаленный сервер.

Предостережение заключается в том, что файлы создаются в каталоге watched одним пользователем (user2), но скрипт выполняется другим пользователем (user1).

Я пытался использовать incron для достижения этой цели, но продолжаю сталкиваться с серьезной проблемой, потому что, хотя сценарий может быть выполнен вручную пользователем user1 с привилегиями root, демон incron является фактически никогда автоматически не запускается событием создания файла другим пользователем2.

Я думал о том, будет ли inoticoming лучшей альтернативой, но мне неясно, как работает синтаксис этого. Если есть лучший способ сделать это, или если я в конечном итоге использую inoticoming , каков будет синтаксис команды, чтобы попросить его посмотреть каталог /home/user1/watched и выполнить скрипт /usr/local/bin/syncbh.sh, если файл создан / Изменено в этом каталоге?

Любая помощь будет высоко ценится.

13
задан 23 April 2015 в 13:14

3 ответа

В первую очередь, сценарий для наблюдения 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
-2
ответ дан 23 April 2015 в 23:14

В первую очередь, установите 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>

    • {}, заменяется именем файла

4
ответ дан 23 April 2015 в 23:14

Используя inoticoming:

Можно вставить сценарий /etc/init.d/ это работает inoticoming во время начальной загрузки.

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

  2. Создайте сценарий 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
  1. Mark сценарий как исполняемый файл: 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.

5
ответ дан 23 April 2015 в 23:14

Другие вопросы по тегам:

Похожие вопросы: