Як запустити скрипт, коли інший користувач змінює каталог?


13

Я знаю, було трохи дискусій щодо подібних тем. Але ось що я в основному намагаюся зробити.

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

Застереження полягає в тому, що файли створюються в watchedкаталозі одним користувачем (user2), але сценарій виконує інший (user1).

Я намагався використовувати інкрон, щоб досягти цього, але продовжуйте стикатися з основною проблемою, оскільки, хоча сценарій може бути виконаний вручну користувачем1 з кореневими привілеями, демон інкону ніколи насправді автоматично не викликається подією створення файлу іншим користувачем2.

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

Будь-яка допомога буде дуже вдячна.


Який користувач повинен запустити сценарій?
AB

І як саме користувач повинен працювати inoticoming?
AB

Будь ласка, прийміть відповідь, яка відповідає вашим потребам, і я дам нагороду за цю відповідь.
Геліо

Відповіді:


5

Використання 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. Позначте сценарій як виконуваний: 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.


4

Перш за все, встановіть 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
  • Процес працює в backgound і переглядає /home/user1/watched

  • Коли файл додається або змінюється в цьому каталозі, /usr/local/bin/syncbh.shвикликається сценарій .

    • Параметр для цього сценарію в цьому випадку /home/user1/watched/<name_of_changed_or_modified_file>

    • {} замінюється на ім'я файлу


-2

Перш за все, сценарій для перегляду 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

1
-1: Ніколи не ставити пароль у файл простого тексту.
Геліо
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.