2016-07-05 3 views
0

私がstdoutを書き込むファイルがcronから実行されるたびに、ファイルは変更されますが、何も書き込まれません。ターミナルからスクリプトを実行している間。私は何をしようとしているのcronから実行されるpythonスクリプトでテキストファイルに書き込み

例:

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

あなたの問題は、ファイルを開いてから書き込んだことが原因である可能性がありますが、それを開いたままにしておきます。次に、ファイルを2回目に開こうとしますが、キャッシングによって書き込まれたデータはまだ利用できません。

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

これを実行すると、ファイルが開いて書き込みが終了します。それは助けてください!

もう1つの可能性は、cronが通常のシェルとは異なる環境で動作するということです。 smartctlコマンドの絶対パスを含めることもできます。私のマシンでは、/ usr/sbin/smartctlです。

また、ローカルユーザーの代わりにrootのcrontabにスクリプトをインストールし、sudoを使用する方が良いかもしれません - そこにはcronの環境でも動作しないような相互作用があるかもしれません。

また、stderrもどこかに行ってエラーを検出できることを確認してください。おそらく、cronで実行しているときに何が問題になっているかを理解するのに役立ちます。通常、これはシステムログまたはローカルユーザーのメールになりますが、それほど役立たない可能性のある設定によって異なります。

スクリプトの作業を行うためにモジュールのインポートを使用しないことをお勧めします。モジュールにはクラスと関数が定義されていて、スクリプト(あなたのrun.py)が呼び出す必要があります。あるいは、コードを直接run.pyに入れてください!

+0

あなたの例を使って試してみましたが、すべてを1つのファイルに入れようとしましたが、同じ結果が得られます。ターミナルからスクリプトを実行すると動作しますが、cronがスクリプトを実行するときに結果ファイルは空です。 –

+0

ええと、それは環境問題を示唆しています。私はその情報も含めて答えを調整します。 –

+0

私は 'sudo'を削除し、' smartctl'へのパスを挿入した後、すべてが機能しました。私がこれをやろうとする前に、他のサーバでも同様のことをしていた古いbashスクリプトをテストしたところ、同じ問題が発生していたことは驚きでした。 :D –

関連する問題