使用flock锁定文件X时间

时间:2017-05-19 18:28:46

标签: linux bash shell raspberry-pi flock

我是Linux新手,目前正在使用Raspberry Pi 3和MotionEye开发安全系统。要通过电子邮件收到通知,我正在尝试创建一个自定义shell脚本,如果有动作,将发送电子邮件,锁定X分钟,然后如果仍有动作则发送另一封电子邮件。但是,我遇到了一些困难。

我创建了一个名为" send_email.py"的简单Python脚本。使用SMTP,当我通过命令行执行电子邮件时,它非常适用于发送电子邮件。

shell脚本(名为" flock_email.sh")是我在一些方面遇到麻烦的地方:

  1. 每当我运行 flock_email.sh 时,它都会完全覆盖 send_email.py 。我试图更改文件权限,因此它只能由用户执行,但仍会覆盖。
  2. flock 命令/功能无法正常工作或根本无法工作。我已经浏览了整个互联网并尝试了多种不同的代码,但没有一种有效。我附上了我尝试的各种 flock_email.sh 脚本。
  3. 不一定是个问题,但我对我的" shebang"行应该是。对于 flock_email.sh 我把它作为"!#/ bin / bash",我认为这使得脚本可执行,至少根据this。我是否仍需要通过命令更改权限" chmod + x flock_email.sh "?路径是/ home / pi,它本质上是我的Pi的主目录。
  4. 我尝试过不同的解决方案:

    1. flock_email.sh 中,我试图直接将文件权限更改为只读,而不是使用 flock ,让它睡眠,然后更改权限返回以允许执行文件。

    2. 多个 flock_email.sh 实现,如附件所示。

    3. 总结:

      1. 我需要在锁定文件 flock_email.sh 之前执行 send_email.py

      2. 一旦锁定,它需要保持锁定X时间。

      3. 有没有人有任何指示或建议?我花了超过15个小时修补这个,觉得我无处可去!

        send_email.py

        #!/usr/bin/env
        import smtplib
        
        def send_email():
            content = "Message I want to send to specified e-mail."
            sender = "e-mail account that will send message"
            pword = "password of sender"
            receiver = "e-mail account that will receive message"
            mail = smtplib.SMTP("smtp.gmail.com",587)
            mail.ehlo
            mail.starttls()
            mail.login(sender,pword)
            mail.sendmail(sender,receiver,content)
            mail.close()
        
        send_email()
        

        flock_email.sh (1):

        #!/bin/bash
        (
            python /home/pi/send_email.py
            flock -e 200
            sleep [time in seconds]
        )
        

        flock_email.sh (2):

        #!/bin/bash
        (
            python /home/pi/send_email.py
            exec 3>/home/pi/send_email.py
            flock -x 3
            sleep [time in seconds]
            exec 3>&-
        )
        

        flock_email.sh (3):

        #!/bin/bash
        python /home/pi/send_email.py
        chmod 444 /home/pi/send_email.py # modify to read only for all
        sleep [time in seconds]
        chmod 755 /home/pi/send_email.py # modify to rwx for owner, r-x for others
        

1 个答案:

答案 0 :(得分:0)

man flock和所有帖子说使用>的原因是因为您应该使用专用锁定文件,通常在/var/lock中:

#!/bin/bash
exec 3> /var/lock/motionmail
flock -ne 3 || exit
python /home/pi/send_email.py
sleep 3600

此外,您还可以在检查锁定之前发送电子邮件,然后中止新电子邮件,而不是将所有电子邮件排队。

您可以根据锁定范围选择锁定文件名称:

  • 如果您每小时只需要一封电子邮件,则可以使用/var/lock/motionmail之类的内容,因为每个系统只有一封。

  • 如果您希望每小时为每个用户发送一封电子邮件,则可以使用$HOME/.motionmail.lock,因为每个用户只有一个。

如果您想使用/home/pi/send_email.py,可以使用<,但这意味着您每小时只需要一封电子邮件,不仅适用于每个用户,编程语言和脚本副本,而且每次点击保存时也是如此并用编辑器替换文件*

*编辑器在替换或覆盖文件方面有所不同