每次从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。
答案 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中!