首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用flock锁定文件X时间

使用flock锁定文件X时间
EN

Stack Overflow用户
提问于 2017-05-19 18:28:46
回答 1查看 1.3K关注 0票数 0

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

我使用send_email.py创建了一个名为“SMTP”的简单Python脚本,当我通过命令行执行它时,它可以很好地发送电子邮件。

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

  1. 每当我运行flock_email.sh时,它都会完全覆盖send_email.py。我试图更改文件权限,因此它只能由用户执行,但它仍然覆盖。
  2. flock命令/功能不像我想的那样工作,或者根本不起作用。我在互联网上到处找过,尝试过多种不同的密码,但没有一种有效。我已经附加了我尝试过的各种flock_email.sh脚本。
  3. 不一定是一个问题,但我有点困惑,我的“她”线应该是什么。对于flock_email.sh,我将其命名为"!#/bin/bash",我认为这使得脚本可以执行,至少根据是这样的。还需要通过命令"chmod +x flock_email.sh“更改权限吗?路径是/home/ Pi,它本质上是我的Pi的主目录。

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

  1. 在flock_email.sh中,我尝试直接将文件权限更改为只读,而不是使用flock,让它休眠,然后将权限更改回允许执行文件。
  2. 附加的多个flock_email.sh实现。

概括地说:

  1. 我需要在锁定文件send_email.py之前执行flock_email.sh。
  2. 一旦锁上,它就需要锁上X个时间。

有人有什么建议或建议吗?我已经花了15个多小时来修补这个问题,我觉得自己什么也没有得到!

send_email.py

代码语言:javascript
复制
#!/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):

代码语言:javascript
复制
#!/bin/bash
(
    python /home/pi/send_email.py
    flock -e 200
    sleep [time in seconds]
)

flock_email.sh (2):

代码语言:javascript
复制
#!/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):

代码语言:javascript
复制
#!/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
EN

回答 1

Stack Overflow用户

发布于 2017-05-19 20:29:27

man flock和所有帖子之所以说要使用>,是因为您应该使用一个专用的锁文件,通常在/var/lock

代码语言:javascript
复制
#!/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中使用<,但这意味着您不仅希望每个用户、编程语言和脚本副本每小时发送一封电子邮件,而且还希望每次使用编辑器*保存和替换文件时都要使用<

*编辑者在替换或覆盖文件方面存在差异

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44076742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档