yum.cronからのエラーメッセージ
自宅のサーバはミッションクリティカルでも何でもないので、パッケージ管理は毎夜cronにお任せ。
で、そのcronからエラーメールが飛んできた。ちょっと長いけど以下のような内容。
Traceback (most recent call last):
File "/usr/bin/yum", line 29, in ?
yummain.user_main(sys.argv[1:], exit_code=True)
File "/usr/share/yum-cli/yummain.py", line 229, in user_main
errcode = main(args)
File "/usr/share/yum-cli/yummain.py", line 104, in main
result, resultmsgs = base.doCommands()
File "/usr/share/yum-cli/cli.py", line 343, in doCommands
return self.yum_cli_commands[self.basecmd].doCommand(self, self.basecmd, self.extcmds)
File "/usr/share/yum-cli/yumcommands.py", line 645, in doCommand
return base.doShell()
File "/usr/share/yum-cli/cli.py", line 284, in doShell
yumshell.script()
File "/usr/share/yum-cli/shell.py", line 78, in script
self.onecmd(line)
File "/usr/lib/python2.4/cmd.py", line 219, in onecmd
return func(arg)
File "/usr/share/yum-cli/shell.py", line 165, in do_ts
self.do_transaction(line)
File "/usr/share/yum-cli/shell.py", line 191, in do_transaction
return self.do_run('')
File "/usr/share/yum-cli/shell.py", line 325, in do_run
(code, msgs) = self.base.buildTransaction()
File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 647, in buildTransaction
(rescode, restring) = self.resolveDeps()
File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 704, in resolveDeps
for po, dep in self._checkFileRequires():
File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 939, in _checkFileRequires
if not self.tsInfo.getOldProvides(filename) and not self.tsInfo.getNewProvides(filename):
File "/usr/lib/python2.4/site-packages/yum/transactioninfo.py", line 414, in getNewProvides
for pkg, hits in self.pkgSack.getProvides(name, flag, version).iteritems():
File "/usr/lib/python2.4/site-packages/yum/packageSack.py", line 300, in getProvides
return self._computeAggregateDictResult("getProvides", name, flags, version)
File "/usr/lib/python2.4/site-packages/yum/packageSack.py", line 470, in _computeAggregateDictResult
sackResult = apply(method, args)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 861, in getProvides
return self._search("provides", name, flags, version)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 43, in newFunc
return func(*args, **kwargs)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 837, in _search
for pkg in self.searchFiles(name, strict=True):
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 43, in newFunc
return func(*args, **kwargs)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 586, in searchFiles
self._sql_pkgKey2po(rep, cur, pkgs)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 470, in _sql_pkgKey2po
pkg = self._packageByKey(repo, ob['pkgKey'])
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 413, in _packageByKey
po = self.pc(repo, cur.fetchone())
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 68, in __init__
self._read_db_obj(db_obj)
File "/usr/lib/python2.4/site-packages/yum/sqlitesack.py", line 94, in _read_db_obj
setattr(self, item, _share_data(db_obj[item]))
TypeError: unsubscriptable object
ちょうどPythonの勉強を始めた事もあって、何とかエラーの内容は想像がついた。単純にアップデートが出来ていない模様。
検索してみたところ、以下の記事にたどり着いた。
CentOS 5 の yum に失敗 (TypeError: unsubscriptable object)
以下のコマンド実行後にyum updateしたら、無事動くようになった。
# yum clean metadata
こうなった原因が気になるところ(・x・ ).o0○
topコマンドのソート順を切り替える
色々あるみたいだけど、利用頻度が高そうなものだけメモ。
-
- [Shift + p] CPU使用率でソート
- [Shift + m] メモリ使用量でソート
- [Shift + t] 実行時間でソート
これらを利用すると、だいぶ見やすくなるな〜(・x・ ).o0○
geditの文字コード判定がおかしい
実は9.04をインストールしてから気になっていた点。
8.10に入っていたgeditでは、UTF-8以外でもsjisだろうがEUC-JPだろうがちゃんと判別してくれたのだけれど、9.04のgeditはどうも上手く判別してくれない。
仕方なく毎回手動で文字コード指定してたけど、gconf-editorで「apps/gedit-2preference/encodings」にある「auto_detected」に自動判別してほしい文字コードを追記すると、ちゃんと判別してくれるようになった。
あとは、PHPファイルで比較演算子「<」を入力すると、タグだと判断して「>」が補完されちゃうのさえ何とかなればバッチリなんだけどなぁ…。
この違いはさすがにコンピュータでは理解し兼ねるかも(・x・ ).o0○
shutdownコマンドで時間指定
今さらだけど、shutdownコマンドでは時間指定出来る。
;; manによると秒(sec)単位 # shutdown -h 3600 ->1時間後にhaltされる
自宅で一人で使ってたりすると、時間指定は「now」ばかり。
Dropboxの同期作業に妙に時間がかかっていたので、外出前に初めて時間指定してみる。
;; Ubuntu 9.04 $ sudo shutdown -h 3600
って、「3600分後にhaltします」とかメッセージが出るんだけど??
もう一度manに目を通したいと思います(・x・ ).o0○
実行に時間のかかるSQLを記録する
twitterにハマって1ヶ月も放置していたけれど、今日からまた再開。
現在SQLの最適化で絶賛悩み中。下手くそなSQLのせいで、100万件のデータを毎回全部読んでしまう。
コンソールから直接SQLを流して、平均2〜3秒。PHPのアプリ経由だと5秒以上かかる。
お話にならないので、色々最適化する方法を調べていたら、MySQLでは実行に時間のかかったSQLをログ記録してくれる「スロークエリログ」とかいう機能があるらしい。ので、早速設定。
;; my.cnfファイルを編集 [mysqld] 何だかんだ log-slow-queries=/var/log/mysqld-slow.log long-query-time=2 log-queries-not-using-indexes
実行時に「long-query-time」で設定した秒数以上かかったSQLを「/var/log/mysqld-slow.log」に記録してくれる。さらに、全件スキャンしてるSQLも記録してくれるそうなので、パフォーマンスの分析に役立つみたい。
閲覧時は、単純にlessやcatでも良いけど、
$ mysqldumpslow /path/to/slow_log
だと見やすく整形してくれるらしい。
こりゃ便利!!
だけど、どう最適化したらいいのかな〜(・x・ ).o0○
strcmpで文字列比較
Fedora 11と戯れすぎてブランクが空いてしまったけど、今日からまた再開。
PHPでよく話題になる「変数の型比較」。型の違う変数を比較するとPHPがよしなに型変換してくれるのだけれど、そのルールが中々にトリッキーらしい。
ので、自衛手段として文字列比較は「strcmp()」を使いましょうという事らしい。
int strcmp ( string $str1, string $str2 )
返り値:
str1 が str2 よりも小さければ < 0 を、str1 が str2 よりも大きければ > 0 を、 等しければ 0 を返します。
という事は、 if (! strcmp($a, $b)) で良いのかな?と思いきや、型をちゃんと意識するなら if (0 === strcmp($a, $b))なのでしょうか…?
基本的に比較演算子は「===」を使っているんだけど、独学の悲しい性、それがモアベターな方法なのかどうか分からない。
フリーのソースなんかだと大抵「==」で、あまり厳密な比較にはこだわってないみたいだけれど…。
どうなんでしょう??(・x・ ).o0○