30分ごとに同時にcrontabから2つのPythonスクリプトを実行します。例:
00,30 6-19 * * 0-5 /.../x.py site1
*/3 6-19 * * 0-5 /.../y.py site2
最初に、両方のスクリプトは、いくつかのデータをログに出力するモジュールのインポートを行います。
name = os.path.basename(sys.argv[0])
site = sys.argv[1]
pid = os.getpid()
時折(!)2番目のスクリプトyは、スクリプトxのログ入力引数に出力します。name=xおよびsite=site1で出力されるプロセスのPIDは同じではありません。なぜこれが起こっているのですか、どうすればこれを回避できますか?
PS問題は私が使用しているロガーに関連していると思います。スクリプトは、別のスクリプトで作成されたロガーを使用できますか?この場合、最初のスクリプトに関連するデータが各行に出力されます。各スクリプトは同じコードを実行します。
log = logging.getLogger('MyLog')
log.setLevel(logging.INFO)
dh = RotatingSqliteHandler(os.path.join(progDirs['log'],'sqlitelog'),processMeta, 5000000)
log.addHandler(dh)
ロガーハンドラーは次のように定義されます。
class RotatingSqliteHandler(logging.Handler):
def __init__(self, filename, progData, maxBytes=0):
logging.Handler.__init__(self)
self.user = progData['user']
self.host = progData['host']
self.progName = progData['name']
self.site = progData['site']
self.pid = random.getrandbits(50)
.....
ログでは、ロガーが最後の行で生成するプロセスIDが両方のスクリプトで同じであることがわかります。
'MyLog'の代わりに、実行する各スクリプトに固有のロガー名を使用してみます。ロガーインスタンスが別のプロセスから取得できるのは奇妙ですが。