2016-11-01 13 views
1

毎時crontabで実行しているスクリプトがあり、API(データベース同期)とやり取りしています。通常は1時間かそこらを取り、このプロセスはまだメモリ内かどうかは次の実行のために確認してください。スクリプトが機能しなくなった後にファイルを削除する方法を教えてください。

#/usr/bin/env python 

import os 
import sys 

pid = str(os.getpid()) 
pidfile = "/tmp/mydaemon.pid" 

if os.path.isfile(pidfile): 
    print "%s already exists, exiting" % pidfile 
    sys.exit() 
file(pidfile, 'w').write(pid) 
try: 
    # Do some actual work here 
finally: 
    os.unlink(pidfile) 

しかし、私は「PS auxを見たときにいくつかの時間後スクリプトは、動作を停止| grepをpython "、私はこのスクリプトをプロセスとして見ませんが、私はその場所にファイルを見ます。 スクリプトを手動で実行すると、繰り返し情報が画面に表示されますが、しばらくすると「Terminated」という文字が表示され、スクリプトが終了してその場所にファイルが残っています。

スクリプトが機能しなくなった後、ファイルを100%削除する方法を教えてください。

ありがとうございます!

答えて

0

通常、atextitモジュールの機能を使用することができますが、あなたのケースでは(予期しない終了)それも動作しない可能性があります。

たぶんwith文の中で(必要なプログラムサフィックス/ refixを指定する)mkstempの使用働く可能性があります。それは/tmpでユニークなpidファイルを作成し、withブロックが完了または終了したとき、それをクリアします。

0

あなたのスクリプトは予期せず終了しているようですが、おそらくメモリ使用量が多すぎるためです。予期しないプログラム終了時にfinallyが実行されることは保証されていません。だから、まず、予期せぬ打ち切りの原因を突き止めることをお勧めします。

実際にファイルが削除されることを保証する方法は100%ありません。しかし、ダングリングpidファイルを処理するためのいくつかの回避策があります。

pidファイルを/var/runボリュームに配置すると、予期しないシステム再起動時に削除されます。このようPIDを持つプロセスがまだ各スクリプトの実行で実行されている天気を

チェック:

import os 

def is_alive(pid): 
    try: 
     os.kill(pid, 0) # do nothing but throws an exception 
     return True 
    except OSError: 
     return False 

# and add this to your code: 
if os.path.isfile(pidfile): 
    with open(pidfile) as f: 
     if is_alive(f.read()): 
      sys.exit() 

再びは、コードが原因の可能なPIDの衝突で100%安全ではありません提供しました。 psコマンド出力の解析を追加することで、実行プロセスの検証をより洗練されたものにすることができます。目的のpid値を持つ行を見つけて、crontabエントリに似ていることを確認してください。

関連する問題