如何以非阻塞方式使用 inotifywait 并邮寄结果?

如何以非阻塞方式使用 inotifywait 并邮寄结果?

我尝试测试我的脚本几次,但都没有成功。这是脚本:

zenity --question --text "my text"
if [ $? -eq 1 ]; then
    zenity --warning --text "my text"
else
    ping -n -c1 192.168.180.112
    # print result (0 se existir)
    echo $?
    if [ $? -eq 0 ]; then
        scp -r ~/Documents/Processo/CONCLUIDO/* [email protected]:/home/posto-ensaios/Documents/Processo
        fileName=$(inotifywait -e moved_from /home/posto-11v/Documents/Processo/CONCLUIDO | sed -r 's/^.*MOVED_FROM(,ISDIR)*\s+(.*)$/\2/g')
        mail -s "$fileName" [email protected] < ~/Documents/personaproject/Programa/scripts/mail.txt
        mv --backup ~/Documents/Processo/CONCLUIDO/* ~/Documents/personaproject/processos_terminados    
        zenity --info --text="my text"
    else
        zenity --warning --text "my text"
    fi
fi

我尝试在sleep命令后面加上“pipe”sed并更改命令的顺序。在终端中运行脚本时问题是inotify总是在等待一个动作......

我需要保证文件已被复制、移动并$filename通过电子邮件发送......

有什么帮助吗?
谢谢!

答案1

如果你希望每次文件从监视目录中移动时都发送邮件,你需要设置不同的流程监控此事并发送邮件。

出于你刚才描述的原因,你把命令放在哪里并不重要inotifywait,因为mv命令不会同时发生,您将无法捕获所需的事件。

但是如果您从另一个进程观察目录,则移动会在您观察时发生,并且您可以检测到任何变化。

通过建立前面的例子,您可以从下面的示例脚本开始。

while true
do
    fileName=$(inotifywait -e moved_from /home/posto-11v/Documents/Processo/CONCLUIDO | sed -r 's/^.*MOVED_FROM(,ISDIR)*\s+(.*)$/\2/g')
    mail -s "$fileName" [email protected] < ~/Documents/personaproject/Programa/scripts/mail.txt
done

请填写所需的详细信息,其工作原理与前面的示例基本相同。

笔记:
有几个注意事项,例如,在发送邮件时可能会错过一些动作。这取决于动作的数量和频率。

答案2

现在的操作如下(初始脚本):

zenity --question --text "my text"
if [ $? -eq 1 ]; then
    zenity --warning --text "my text"
else
    ping -n -c1 192.168.180.112
echo $?
if [ $? -eq 0 ]; then
    scp -r ~/Documents/Processo/CONCLUIDO/* [email protected]:/home/posto-ensaios/Documents/Processo
    nohup ~/Documents/personaproject/Programa/scripts/mail.sh &
    sleep 1
    mv --backup ~/Documents/Processo/CONCLUIDO/* ~/Documents/personaproject/processos_terminados    
    zenity --info --text="my text"
else
    zenity --warning --text "my text"
fi
fi

然后我的新“mail.sh”脚本监视文件夹并单独发送电子邮件:

while true
do
    fileName=$(inotifywait -e moved_from /home/posto-11v/Documents/Processo/CONCLUIDO | sed -r 's/^.*MOVED_FROM(,ISDIR)*\s+(.*)$/\2/g')
    mail -s "$fileName" [email protected] < ~/Documents/personaproject/Programa/scripts/mail.txt
done

就像您说的,有一些注意事项,如果有多个文件,则只会发送一封电子邮件,其中包含有关该主题的第一个文件夹。这是需要改进的。虽然这是一个由用户执行的脚本,但大约每周执行一次,并且可能只有一个文件夹。

谢谢!

答案3

zenity --warning --text "my text" &

作为后台命令运行,非阻塞

相关内容