30 11 2012 Python javascript Tweet
pythonでちょっとしたクローラーを書いて終夜で流したい時に、夜中に落ちたりすると時間がもったいないので、死んでも生き返るようにしておきたいことがある。
追記121203
はてブで指摘された通り
forever start -c python crawler.py
で良かった。ドキュメントにちゃんと書いてあった。
node.jsで書いた場合にはforeverが使えて便利だが、他の言語で書いた場合にはchild_processで子プロセスにして呼び出せばいいので、javascriptをちょっと書いておけば、PythonでもPerlでもHaskellでもなんでも使える。
でもjavascriptを毎回書くのは(忘れるし)面倒なのでforever用のjavascriptを出力するスクリプトをpythonで書いてみた(foreverizeっていう名前)。
#!/usr/bin/env python import sys js_str = """var spawn = require('child_process').spawn; var app = spawn('{}', [{}]); app.stdout.on('data', function(data) {{ console.log('stdout: ' + data); }}); app.stderr.on('data', function(data) {{ console.log('stderr: ' + data); }}); app.on('exit', function(code) {{ console.log('exit code: ' + code); }}); """ if __name__ == '__main__': if len(sys.argv) < 2: print "Usage: {} [command]".format(sys.argv[0]) else: command = sys.argv[1] options = "" if len(sys.argv) >= 2: options = ",".join(["'{}'".format(op) for op in sys.argv[2:]]) print js_str.format(command, options)
使い方は簡単
foreverize python crawler.py > crawler.js forever start crawler.js
これで、デーモン化されて夜でも安心。