Come eseguire uno script quando una directory viene modificata da un altro utente?


13

So che è stato un po 'di discussione su argomenti simili a questo. Ma ecco cosa sto sostanzialmente cercando di fare.

Ho una directory di controllo chiamata watchede ogni volta che un file viene aggiunto a quella directory, voglio attivare uno script chiamato syncbh.shche estrarrà i file da quella directory e li caricherà su un server remoto.

L'avvertenza è che i file vengono creati nella watcheddirectory da un utente (utente2), ma lo script viene eseguito da un altro (utente1).

Ho provato a utilizzare incron per ottenere questo risultato, ma continuo a riscontrare un grave problema perché mentre lo script può essere eseguito manualmente dall'utente1 con i privilegi di root, il daemon incron non viene mai attivato automaticamente da un evento di creazione di file da parte dell'altro utente2.

Ho pensato se l' inoticoming sarebbe un'alternativa migliore, ma non sono chiaro come funzioni la sintassi di questo. Se esiste un modo migliore per raggiungere questo obiettivo, o se finisco con inoticoming quale sarebbe la sintassi del comando per chiedergli di guardare la /home/user1/watcheddirectory ed eseguire lo script /usr/local/bin/syncbh.shse un file viene creato / modificato all'interno di quella directory?

Qualsiasi aiuto sarebbe molto apprezzato.


Quale utente deve eseguire lo script?
AB

E quale utente dovrebbe eseguire inoticoming?
AB,

Ti preghiamo di accettare la risposta adatta alle tue esigenze e darò la grazia a quella risposta.
Helio,

Risposte:


5

Utilizzando inoticoming:

È possibile inserire uno script /etc/init.d/che viene eseguito inoticomingall'avvio.

  1. Crea una nuova cartella per contenere il inoticomingregistro / ultimo pidper la watchedcartella:sudo mkdir -p /var/log/inoticoming/watched/

  2. Crea uno script inoticoming_watchedin /etc/init.d/:

* Ricorda di cambiare <percorso_percorso> e <percorso_script> in modo che corrispondano al percorso completo della watchedcartella e al percorso completo dello script da eseguire

#!/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. Contrassegna lo script come eseguibile: sudo chmod u+x /etc/init.d/inoticoming_watched

  2. Assicurati che lo script sia chiamato da inoticoming_watched sia eseguibile.

  3. Aggiornamento rc.dper rendere il servizioinoticoming_watched avviare all'avvio:sudo update-rc.d inoticoming_watched defaults

Puoi controllare il inoticominglogin /var/log/inoticoming/watched.


4

Prima di tutto, installa inoticoming :

sudo apt-get install inoticoming

Quindi utilizzare questo comando:

Presta attenzione ai processi in corso di inoticoming, perché possono essere avviati più volte.

$ inoticoming /home/user1/watched /usr/local/bin/syncbh.sh /home/user1/watched/{} \;
              ^                   ^                        ^
              |                   |                        |
              ^-- The directory to be monitored            |
                                  |                        |
                                  ^-- Your script          |
                                                           ^-- The parameter for your script
  • Il processo si svolge in backgound e sta guardando /home/user1/watched

  • Quando un file viene aggiunto o modificato in quella directory, /usr/local/bin/syncbh.shviene chiamato lo script .

    • Il parametro per questo script è in questo caso /home/user1/watched/<name_of_changed_or_modified_file>

    • {} è sostituito dal nome file


-2

Prima di tutto, uno script per guardare la watcheddirectory:

#! /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

Secondo Per effettuare la sincronizzazione come altro utente (utente2) il:

sudo -H -u user2 bash -c 'sh /usr/local/bin/syncbh.sh ' 

Ora, al fine di non richiedere all'utente, è possibile impostare la sudopassword in un file e leggere la password da questo file quando necessario (notare che è necessario utilizzare -Scon sudoper ottenere la password dal file).

Metti la tua sudopassword in un file, supponi passwd.txt, quindi il comando sopra sarà succhiato come

sudo -S -H -u user2 bash -c 'sh /usr/local/bin/syncbh.sh ' < /path-to/passwd.txt

Ora lo script generale sarà come:

#! /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: non inserire mai la password in un file di testo normale.
Helio,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.