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

我知道关于类似话题的讨论已经有一些了。但是这是我基本上想要做的事情。
我有一个名为“watched”的监视目录,每当有文件添加到该目录时,我想触发一个名为“syncbh.sh”的脚本,该脚本将把文件从该目录中取出并上传到远程服务器。
问题在于,文件是由一个用户(user2)在“watched”目录中创建的,但脚本是由另一个用户(user1)执行的。
我尝试使用incron来实现这个目标,但一直遇到一个主要问题,因为虽然脚本可以由具有root权限的user1手动执行,但incron守护进程实际上从未被其他用户user2的文件创建事件自动触发过。
我考虑过是否使用inoticoming会是一个更好的选择,但是我对它的语法如何工作还不清楚。如果有更好的方法来实现这个功能,或者最终我决定使用inoticoming,那么要让它监视/home/user1/watched目录,并在该目录中创建/修改文件时执行脚本/usr/local/bin/syncbh.sh,应该使用什么命令语法呢?
非常感谢任何帮助。

哪个用户必须运行这个脚本? - A.B.
那么,哪个用户应该运行inoticoming呢? - A.B.
请接受最适合您需求的答案,我将把赏金给予那个答案。 - 0x2b3bfa0
3个回答

使用inoticoming:
您可以在/etc/init.d/中放置一个脚本,在启动时运行inoticoming。
1. 创建一个新的文件夹来保存watched文件夹的inoticoming日志/最后的pid:sudo mkdir -p /var/log/inoticoming/watched/ 2. 在/etc/init.d/中创建一个名为inoticoming_watched的脚本:
*请记得将和更改为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

3. 将脚本标记为可执行:sudo chmod u+x /etc/init.d/inoticoming_watched 4. 确保由inoticoming_watched调用的脚本是可执行的。 5. 更新rc.d以使服务inoticoming_watched在启动时自动启动:sudo update-rc.d inoticoming_watched defaults
您可以在/var/log/inoticoming/watched中检查inoticoming日志。

首先,安装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

该进程在后台运行,并监视/home/user1/watched目录。 当该目录中添加或更改文件时,将调用脚本/usr/local/bin/syncbh.sh。 在这种情况下,该脚本的参数为/home/user1/watched/。 {}将被替换为文件名。

首先,一个脚本来监视“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密码设置在一个文件中,并在需要时从这个文件中读取密码(注意你必须使用sudo -S命令从文件中获取密码)。
将你的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永远不要将密码放在明文文件中。 - 0x2b3bfa0