Pythonの環境が壊れた?

先日、とあるサーバで実行していたPythonの環境がなぜだかおかしくなって、ある日を境にPythonを一部に使って動いているスクリプトが正常動作しなくなったんですよ。おかしいなと思って、同様にPythonで動いているaws cliのコマンドを叩いてみると、単に実行しただけなのにStack吐いてエラーになってしまう状況。

何かでPythonの環境が壊れたかと考えてaptで修復しようと考えて、改めてaptでPythonをインストールしようとしても、こんどはaptの中の処理でPythonが動くところでエラーになりaptも正常に動作しない。これ以上環境を変更するような作業をすると、修復できない状況に陥りかねないのと、幸いPythonが絡んでいないコマンド関係は特に問題が起きていないので、該当する処理は別のサーバに移動させたりして当面の問題は回避。

とは行っても壊れたままだと色々問題が起こりかねないので解決の為の調査は継続。

しばらくして、改めて修復しようとaptを実行してみたり、単にPythonを起動してみたりして出てくるエラーメッセージを検索にかけて調べてみると、出てくる記事の1つに光明が。そのエラーメッセージは

EOFError: marshal data too short

というもので、その記事の中には「.pycファイルが原因で、削除すれば解消できる」旨が書かれていました。「そうか実行時の中間キャッシュファイルか!」と言う事でエラーになる状況を(何となく)理解。

というのも上記の環境がおかしくなったサーバで、丁度エラーが出始めたのと同じタイミングに一回ディスクフルの障害をやらかしていて、そのタイミングでPython関連のスクリプトが実行されていたらキャッシュも壊れていてもおかしくはない。ただ、この情報を見るまでは、ディスクフルになったとしても逆にそのタイミングで環境を変更するようなapt update/upgradeは実行していないし、それに準ずるような作業などもしていないのでPythonの実行環境がおかしくなるなんてことは通常は考えられないと調査の線から少し話しておいたんですよ。実行時の中間キャッシュであれば実行のタイミングによっては更新されることもあるだろうし、更新のタイミングでディスクフルになったら変な状態のキャッシュファイルなってしまう事もありそう。

早速.pycフィあるを削除する準備に。確認したところ、このファイルはとりあえず削除しても問題ないらしく、仮に問題のない.pycを消したところでその後実行されるときに再度作られそうなので副作用もキャッシュが消えたことで若干実行に時間がかかるかもしれない程度。そういうわけで、早速サーバ全体で.pycファイルを探して削除!

sudo find / -name *.pyc | sudo xargs -I {} rm {}

で、改めてPythonを空実行してみると、先に出ていたエラーメッセージは出なくなり、別のエラーが・・・。と行っても見慣れたエラーでモジュールが足りないというやつでこれは多分aptを-fつけて実行すれば大丈夫!?な筈。

sudo apt-get -f upgrade

ついでにupgradeもしちゃう勢いで実行すると.pycファイルを消す前は途中でエラーがでて実行できなかった処理が止まる事無く処理完了。

おそるおそる今度はaws cli(awsコマンド)を空実行してみると、何のエラーもでず情報が表示されて正常終了。止めていたPythonを利用するスクリプトも問題でないし、aws cliも使える!ということで回復、一件落着!

いやぁ~、キャッシュって怖いですねw

 

カテゴリー: テック パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です