使用从cron

时间:2016-07-05 10:23:39

标签: python cron

每次从cron运行脚本时,我写入stdout的文件都是空的,文件被修改但没有写入。从终端运行脚本时工作。

我尝试做的例子:

  

run.py

#!/bin/python2
import os
os.chdir('/home/user')
import getsmart
import sendemail
  

getsmart.py

#!/bin/python2

from subprocess import call
import os

os.chdir('/home/user')

f = open("result", "w")
call(["sudo","smartctl", "-a", "/dev/sda"], stdout=f)
call(["sudo","smartctl", "-a", "/dev/sdb"], stdout=f)
  

sendmail.py

#!/bin/python2

# Import smtplib for the actual sending function
import smtplib
import os

# Import the email modules we'll need
from email.mime.text import MIMEText

os.chdir('/home/user')

# Open a plain text file for reading.  For this example, assume that
# the text file contains only ASCII characters.
fp = open('result', 'rb')
# Create a text/plain message
msg = MIMEText(fp.read())
fp.close()

# me == the sender's email address
# you == the recipient's email address
msg['Subject'] = ''
msg['From'] = ''
msg['To'] = ''

# Send the message via our own SMTP server, but don't include the
# envelope header.
s = smtplib.SMTP('')
s.sendmail('', '', msg.as_string())
s.quit()
  

的cron

* * * * * /home/user/run.py

该脚本具有执行权限。

-rwxr-xr-x. 1 user user 84 Jul  5 12:20 /home/user/run.py

正如我们在日志中看到的那样,脚本正在执行:

Jul 5 13:11:01 localhost CROND[10945]: (root) CMD (/home/giumbai/run.py)

据我所知,问题是关于执行命令输出写入stdout的方式或者如何使用脚本从stdout读取。 python文档对我没有帮助,也没有搜索www。

1 个答案:

答案 0 :(得分:1)

很可能你的问题是由于你打开了文件然后写入文件......但是它仍然打开了。然后,您尝试再次打开该文件,但由于缓存,写入的数据尚不可用。如果您更改第一个模块,则执行以下操作:

with open("result", "w") as f:
    call(["sudo","smartctl", "-a", "/dev/sda"], stdout=f)
    call(["sudo","smartctl", "-a", "/dev/sdb"], stdout=f)

这将打开文件,写入文件然后关闭它。那应该有帮助!

另一种可能性是cron在与普通shell不同的环境下运行。您可能希望包含smartctl命令的完整路径。在我的机器上是/ usr / sbin / smartctl。

此外,最好在root用户的crontab下安装脚本而不是本地用户并使用sudo - 可能还有与在cron下无法在cron下工作的环境进行交互

还有另外一个需要考虑的选项:确保stderr也可以在某个地方运行,这样你就可以检测到错误 - 这可能会帮助你找出使用cron运行时遇到的麻烦。通常这是系统日志或本地用户的邮件,但取决于您的配置可能没有帮助!

作为旁注,最好不要使用模块的导入来完成脚本的工作。模块应该在其中定义类和函数,然后脚本(您的run.py)调用它们。或者直接将代码放在run.py中!