使用羊群锁定文件X时间



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

我使用SMTP创建了一个名为"send_email.py"的简单Python脚本,当我通过命令行执行它时

,它可以很好地发送电子邮件。shell脚本(名为"flock_email.sh")是我在几个方面遇到麻烦的地方:

  1. 每当我运行flock_email.sh时,它都会完全覆盖send_email.py。我尝试更改文件权限,使其只能由用户执行,但它仍然会覆盖。
  2. flock命令/功能无法按我的预期工作或根本无法正常工作。我遍历了互联网并尝试了多个不同的代码,但没有一个有效。我已经附上了我尝试过的各种flock_email.sh脚本。
  3. 不一定是问题,但我对我的"shebang"台词应该是什么有点困惑。对于flock_email.sh,我将它作为"!#/bin/bash",我相信这使脚本具有可执行性,至少根据这一点。我还需要通过命令">chmod +x flock_email.sh"更改权限吗?路径是/home/pi,它本质上是我的 Pi 的主目录。

我尝试过的不同解决方案:

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

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

总结一下:

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

  2. 锁定
  3. 后,它需要保持锁定 X 时间。

有人有任何指示或建议吗?我花了超过 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

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<,但这意味着您不仅需要每小时一封电子邮件,不仅针对每个用户、编程语言和脚本副本,而且每次点击保存并用编辑器替换文件时都需要一封电子邮件*


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

最新更新