【发布时间】:2017-10-19 23:29:52
【问题描述】:
我是一名 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”,我相信它可以使脚本可执行,至少根据this。我还需要通过命令“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
【问题讨论】:
-
exec 3>/home/pi/send_email.py打开文件进行写访问,这会将文件截断为零字节。你为什么这样做? -
#!行不会使脚本可执行,chmod u+x script name就是这样做的。#!行指定要使用的解释器。在这种情况下,它是bash,但也可能是sed、awk、perl、python、ruby,等等。如果您未指定#!,则默认值为sh,这是基本的 POSIX shell(取决于平台)。 -
您想通过使用
flock来实现什么?为什么需要使用它? -
你为什么不直接使用
cron? -
@cdarke,我没有意识到这一点。我关注的Stack Overflow post 让它看起来好像只是打开了文件句柄。 'chmod u+x script name' 部分很有意义。由于 MotionEye 的通知系统,我正在使用“flock”。它会在检测运动时每分钟发送一封电子邮件。因此,如果在镜头前有 15 分钟的动作,我将收到 15 封电子邮件。我想将其更改为每 X 分钟一封电子邮件,因为它已被锁定,因此不允许执行该文件。
标签: linux bash shell raspberry-pi flock