【问题标题】:Using flock to lock file for X time使用flock锁定文件X时间
【发布时间】:2017-10-19 23:29:52
【问题描述】:

我是一名 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”,我相信它可以使脚本可执行,至少根据this。我还需要通过命令“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. 一旦锁定,需要保持锁定 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,但也可能是sedawkperlpythonruby,等等。如果您未指定 #!,则默认值为 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


【解决方案1】:

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


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

【讨论】:

  • 我继续并根据您的代码创建了一个名为motion_email.sh 的新文件并将其放在/var/lock/ 中。我每小时只想要一封电子邮件。我尝试在终端中运行/var/lock/motion_email.sh,但尽管设置了权限,但仍被拒绝权限,因此所有者可以 rwx 并且所有其他人都可以 r-x。我是主人。我不确定我做错了什么。我的第一个想法是我应该有另一个文件,因为您的代码“指向”(不确定合适的词)到 /var/lock/ 文件。我看到您的/var/lock/motionmail 没有.sh 扩展名,对吗?感谢您的回复!
  • 这重复了尝试锁定脚本文件而不是专用的空锁定文件的错误。这个 sn -p 会自动创建锁定文件。将此脚本放入您的/home/pi/flock_email.sh
猜你喜欢
  • 2013-05-23
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-09
  • 1970-01-01
相关资源
最近更新 更多