我知道已经有一些关于类似主题的讨论。但我基本上想做的是这样的。
我有一个名为的监视目录watched
,每当有文件添加到该目录时,我都会触发一个名为的脚本,syncbh.sh
该脚本将从该目录中取出文件并将其上传到远程服务器。
需要注意的是,文件是watched
由一个用户(user2)在目录中创建的,但脚本却由另一个用户(user1)执行。
我试过使用因克龙来实现这一点,但仍然遇到一个大问题,因为虽然该脚本可以由具有 root 权限的用户 1 手动执行,但因克龙守护进程实际上永远不会被其他用户2的文件创建事件自动触发。
我考虑过信息传递会是一个更好的选择,但我不清楚这个语法是如何工作的。如果有更好的方法来实现这一点,或者我最终使用信息传递如果在该目录中创建/修改了文件,命令语法是什么以要求它监视/home/user1/watched
目录并执行脚本?/usr/local/bin/syncbh.sh
任何帮助将非常感激。
答案1
使用inoticoming
:
您可以放入一个在启动时/etc/init.d/
运行的脚本。inoticoming
创建一个新文件夹来保存该文件夹的
inoticoming
日志/最后:pid
watched
sudo mkdir -p /var/log/inoticoming/watched/
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
将脚本标记为可执行:
sudo chmod u+x /etc/init.d/inoticoming_watched
确保调用的脚本
inoticoming_watched
是可执行的。更新
rc.d
以使服务inoticoming_watched
在启动时启动:sudo update-rc.d inoticoming_watched defaults
您可以检查inoticoming
登录情况/var/log/inoticoming/watched
。
答案2
首先,安装信息传递:
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/<name_of_changed_or_modified_file>
{}
被文件名替换
答案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
第二,以另一个用户(用户2)的身份进行同步:
sudo -H -u user2 bash -c 'sh /usr/local/bin/syncbh.sh '
现在,为了不让用户提示,您可以sudo
在文件中设置密码,并在需要时从该文件中读取密码(请注意,您必须使用-S
withsudo
从文件中获取密码)。
假设将你的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