ライブラリの ver. up 後、翌日3時にシンボルが見つからなくなる
CentOS 6.x でライブラリ rpm の ver-up をしたときの話。
依存プログラムをそのときに再起動したのだけど、翌日3時になるとなぜか共有ライブラリが見つからないのようなエラーが。
このとき、プロセスがどんなライブラリを開こうとして何が見つからなくなってるかは lsof -p $PID | grep DEL
とかでわかります。
そのときは /lib64/
以下の共有ライブラリが見つからなくなっているようでした。
しかも、そのライブラリのパスに #prelink#
という怪しげな文字が。
イメージはこんな感じ:
% sudo lsof -p 1513 | head -1 && sudo lsof -p 1513 | grep DEL COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME : httpd 1513 root DEL REG 252,1 3417639 /lib64/libdl-x.x.so httpd 1513 root DEL REG 252,1 3417643 /lib64/libexpat.so.x.#prelink#.E4Timi :
…と、ここまで書けばもうお察しの方もいるかもしれませんが、毎日3時に動いている /etc/cron.daily/prelink
が悪さをしていました。
prelink
が何か詳細は割愛します(というか、よくわかっていないところもある)が、プログラムが動くときに必要になる動的ライブラリのリンクを予め行って、起動を高速化してくれるようなもの、というような認識。
最初はよくわからなくて、とりあえず再起動したら直って、その後そのサーバでは起きなくなりました。
なぜかというと prelink
は1回 prelink
したバイナリを覚えてくれるようです。(/etc/prelink.cache
とかある)
prelink -f /usr/sbin/httpd
したら、またおかしくなってしまいました。
ので、そもそも prelink を無効化しておいた方がよいかも。
(勝手にバイナリ書き換えられるのとか怖い。。)