我是Linux新手,目前正在使用Raspberry Pi 3和MotionEye开发安全系统。为了通过电子邮件获取通知,我正在尝试创建一个自定义 shell 脚本,如果有运动,它将发送电子邮件,锁定 X 分钟,如果仍有运动,则发送另一封电子邮件。但是,我遇到了一些困难。
我使用SMTP创建了一个名为"send_email.py"的简单Python脚本,当我通过命令行执行它时
,它可以很好地发送电子邮件。shell脚本(名为"flock_email.sh")是我在几个方面遇到麻烦的地方:
- 每当我运行flock_email.sh时,它都会完全覆盖send_email.py。我尝试更改文件权限,使其只能由用户执行,但它仍然会覆盖。
- flock命令/功能无法按我的预期工作或根本无法正常工作。我遍历了互联网并尝试了多个不同的代码,但没有一个有效。我已经附上了我尝试过的各种flock_email.sh脚本。
- 不一定是问题,但我对我的"shebang"台词应该是什么有点困惑。对于flock_email.sh,我将它作为"!#/bin/bash",我相信这使脚本具有可执行性,至少根据这一点。我还需要通过命令">chmod +x flock_email.sh"更改权限吗?路径是/home/pi,它本质上是我的 Pi 的主目录。
我尝试过的不同解决方案:
在flock_email.sh中,我尝试直接将文件权限更改为只读,而不是使用flock,让它处于睡眠状态,然后将权限更改回以允许执行文件。
多个flock_email.sh实现,如附件所示。
总结一下:
我需要在锁定文件flock_email.sh之前执行send_email.py。
锁定后,它需要保持锁定 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
<
,但这意味着您不仅需要每小时一封电子邮件,不仅针对每个用户、编程语言和脚本副本,而且每次点击保存并用编辑器替换文件时都需要一封电子邮件*
* 编辑器在替换或覆盖文件方面有所不同