当另一个用户更改目录时如何运行脚本?


13

我知道已经对与此类似的话题进行了一些讨论。但是,这基本上是我要做的。

我有一个名为watch的监视目录watched,无论何时将文件添加到该目录,我都想触发一个名为的脚本syncbh.sh,该脚本将从该目录中取出文件并将其上传到远程服务器。

需要注意的是,文件是watched由一个用户(user2)在目录中创建的,而脚本是由另一个用户(user1)执行的。

我曾尝试使用incron来完成此操作,但是仍然遇到一个主要问题,因为尽管可以由具有root特权的user1手动执行脚本,但是incron守护程序实际上从未真正由其他user2的文件创建事件自动触发。

我曾考虑过使用inoticoming是否会是更好的选择,但目前尚不清楚它的语法如何工作。如果有更好的方法来完成此操作,或者如果我最终无法使用该命令语法,则要求该命令语法监视/home/user1/watched目录并执行脚本(/usr/local/bin/syncbh.sh如果在该目录中创建/修改了文件)?

任何帮助将非常感激。


哪个用户必须运行脚本?
AB

以及应该由哪个用户运行inoticoming
AB

请接受适合您需求的答案,我将提供相应的奖励。
Helio,2015年

Answers:


5

使用inoticoming

您可以在启动时/etc/init.d/运行一个脚本inoticoming

  1. 创建一个新的文件夹来保存inoticoming日志/最后pidwatched文件夹: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
  • 该过程在背景中运行并且正在监视 /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在文件中设置密码,并在需要时从该文件中读取密码(请注意,必须使用-Swith 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:切勿将密码放在纯文本文件中。
Helio
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.