Can’t create/write to file ‘/tmp/xxxxxx’

作業していたら、突然MySQLが落ちた。

mysqldの再起動を行っても、以下のようなエラーが/var/lib/mysql/hoge.errに記録されるだけで起動できない。

111026 11:38:54 mysqld_safe mysqld from pid file /var/lib/mysql/hoge.pid ended
111026 11:38:54 mysqld_safe Starting mysqld daemon with databases from /var/lib/mysql
111026 11:38:54 [Note] Plugin ‘FEDERATED’ is disabled.
111026 11:38:54 InnoDB: The InnoDB memory heap is disabled
111026 11:38:54 InnoDB: Mutexes and rw_locks use GCC atomic builtins
111026 11:38:54 InnoDB: Compressed tables use zlib 1.2.3
111026 11:38:54 InnoDB: Using Linux native AIOG /usr/sbin/mysqld: Can’t create/write to file ‘/tmp/ib96HR1Q’ (Errcode: 28)
111026 11:38:54  InnoDB: Error: unable to create temporary file; errno: 28
111026 11:38:54 [ERROR] Plugin ‘InnoDB’ init function returned error.
111026 11:38:54 [ERROR] Plugin ‘InnoDB’ registration as a STORAGE ENGINE failed.
111026 11:38:54 [ERROR] Unknown/unsupported storage engine: InnoDB
111026 11:38:54 [ERROR] Aborting

111026 11:38:54 [Note] /usr/sbin/mysqld: Shutdown complete

111026 11:38:54 mysqld_safe mysqld from pid file /var/lib/mysql/hoge.pid ended

どうやらテンポラリディレクトリに指定している/tmp内にファイルが書き込めないらしい。

/tmpのパーミッションを777にして、mysqldの再起動。

ん~、変化なし。

色々調べたが、直前の作業の時に出来たゴミを捨ててなかったのが原因で、/tmpがある/の容量が100%を指していた為だった。

Apache Killerの対策

8/24に会社から連絡があり、取り急ぎ対策が必要なApacheには、アドバイザリ通りの記述行い対策しました。
おかげでエヴァ波の地上波の前半を見逃した・・・orz

# Drop the Range header when more than 5 ranges.
# CVE-2011-3192
SetEnvIf Range (?:,.*?){5,5} bad-range=1
RequestHeader unset Range env=bad-range

# We always drop Request-Range; as this is a legacy
# dating back to MSIE3 and Netscape 2 and 3. RequestHeader unset Request-Range

あと、仕事上付き合いがある徳丸氏のブログにも本件について書かれており、MaxClientsのチューニングが重要だと。

ウチもApache2.2を使っているが、MaxClientsのデフォルト値は150だった。
Apache Killerの対策をしないと、MaxClients150×24MBで、3600MB(約3.5GB)のメモリをApacheだけで食う事になる。

契約しているVPSはメモリ1GBコースだから、無理www

つーことで、httpd-mpm.confのMaxClients数を25に落とす。
こんな寂れたブログを見に来る人もいないだろうからw

–2011.8.31 追記–
8/30に2.2.20がリリースされました。
http://archive.apache.org/dist/httpd/httpd-2.2.20.tar.bz2

apache2.0系はまだ未リリースみたい。
暫定対策が済んでいないapacheがあれば、至急アップデートを行いましょう。

mailmanの入れ直し

VPSに引っ越しした時に放置していたメーリングリストサーバ「Mailman」を入れ直した。

会社のメーリングリストサーバでもMailmanを使っていますが、構成が少し違っただけでハマったのでメモ。
(ほとんどsatospoを参照w)

ちなみに会社の構成は楽して作ったので全てRPMで導入、設置してるから気づかなかったw

VPSではApacheをソースインストールしてるが、Mailmanをインストールしたらsetguiがnobody(ApacheをRPMでインストールした時のユーザー)を指定しないと動かなかったから、しょうがなくMailmanをソースからインストール(2011.8.21時点での最新は2.1.14+j6)

Mailmanはpythonプログラムだが、2.1.14以降でpython2.5以上でしか動かなくなったっぽいので、さらにpythonをソースからインストール。

Redmineのcsvエクスポートに更新履歴も出力させる

またRedmineネタ。

上司殿が会議の場で「Redmineにエクスポート機能があるから、それ使ってバックアップ取ればいいんじゃね?」って発言をしたらしい。

その話聞いて、「Redmineはチケット一覧しかエクスポートできませんよ?」って答えると、「えーっ、なんとかしてよ!」って・・・orz

プラグインで対応出来るか、グーグル先生に聞いたが適切な物がなかった。
XLS Exportでは、標準のCSVエクスポートをエクセルで出力できるだけだった)

さらに調べると、標準のCSVエクスポートのソースをいじる事で対応出来そう。

徒然さめざめ Redmine hack! – チケット一覧のcsv出力に履歴も載せる –

内容は2009年の物だが、 Redmine 1.1.2と1.1.3でもちゃんと動作した。

いつも思うが、こうゆう先駆者のブログとかすごく役に立つなぁ。

一応、変更後のissues_helper.rbをアップしておく。
issues_helper.rb

Redmineのviewカスタマイズ

redmine1.1.3(1.1.2でもOK)で、プロジェクトの見せ方を変更した。

(1)プロジェクトメニューのチケットボタンの遷移先をカスタマイズクエリで表示させる。
せっかくカスタマイズクエリ作っても、「チケット一覧」→「クエリ選択」とかめんどくさい。

lib/redmine.rbを変更
menu.push :issues, { :controller => ‘issues’, :action => ‘index’}, :param => :project_id, :caption =>
:label_issue_plural

   ↓

menu.push :issues, { :controller => ‘issues’, :action => ‘index’, :query_id => ‘1’ }, :param => :project_id, :caption => :label_issue_plural

app/views/projects/show.rhtmlも変更
<%= link_to l(:label_issue_view_all), :controller => ‘issues’, :action => ‘index’, :project_id => @project, :set_filter => 1 %>

   ↓

<%= link_to l(:label_issue_view_all), :controller => ‘issues’, :action => ‘index’, :project_id => @project, :query_id => 1 %>

(2)チケットの変更履歴に区切り線を入れる。
変更履歴が多すぎると見辛くなるって意見があったみたい。

public/themes/alternate/stylesheets/application.cssに以下を追加(themesは今使ってる奴)
 /* history */
 div#history {
   border: solid 1px #cccccc;
   background-color: #ffffff;   (ここで変更履歴の色を指定。ウチは白w)
   padding: 5px;
 }

 div#history > h3 {
   border-bottom: none;
 }

 div#history > .journal {
   border-top: solid 1px #cccccc;
   padding-right: 5px;
   padding-left: 5px;
 }

 div#history > .journal > h4 {
   border-bottom: none;
   margin: 0px;
 }

変更が終わったらApacheを再起動する。

dfコマンドの結果

今更気づいたが、なぜかbootに13GBも割り当てていた事が判明。

[root@mario /]# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/hda3             4.8G  3.9G  607M  87% /
/dev/hda6              13G  1.5G   11G  13% /usr/local
/dev/hda5             4.8G  618M  3.9G  14% /var
/dev/hda1              13G  177M   12G   2% /boot
tmpfs                 379M     0  379M   0% /dev/shm

bootってfsck出来なかったと思うから、再インストール決定!・・・orz

ruby-garoon2icalをruby1.9で動かす

以前、ruby-garoon2icalを利用させて頂き、会社のサイボウズガルーンとgoogleカレンダー経由でiphoneのカレンダーに表示させていたが、ruby1.9.2にアップデートしてからプログラムがエラーを吐くようになった。

エラー箇所は「csv = CSV.parse(result3.body.toutf8)」の部分で、調べると改行コードがCR+LFだとエラーになるっぽい。

仕事のスケジュールが見えないと、何かとめんどくさいのでruby1.9で動くように改修。

たぶん上手い書き方があると思うけど、とりあえず動けば良いので、一旦改行コードがCR+LF形式のCSVを出力してから改行コードを置換すると言った幼稚な書き方をしています。

icalはちゃんと作成されたっぽいので、後はgoogleカレンダーの設定をやり直して待つだけ。

ちゃんと読み込むといいなぁ。

【追記】
cronで回したら以下のようなエラーが発生。
 /usr/local/lib/ruby/1.9.1/csv.rb:2027:in `=~': invalid byte sequence in US-ASCII (ArgumentError)
    from /usr/local/lib/ruby/1.9.1/csv.rb:2027:in `init_separators'
    from /usr/local/lib/ruby/1.9.1/csv.rb:1570:in `initialize'
    from /usr/local/lib/ruby/1.9.1/csv.rb:1335:in `new'
    from /usr/local/lib/ruby/1.9.1/csv.rb:1335:in `open'
    from /usr/local/apache2/htdocs/garoon2-sync/garoon2ical.rb:65:in `<main>'

ruby1.9から文字コードの取り扱いが厳格になった(ruby1.8を知らんが)らしいので、実行時に文字コードを指定する。

ruby -Ku garoon2ical.rb

【追記2】
同期したら文字化けしてた。
どうやらicsを直接見に行かせると、
charsetを送っていないらしい。
icsを吐くディレクトリに.htaccessを作成して

AddType “text/calendar; charset=utf-8” ics
を記載。

続きを読む ruby-garoon2icalをruby1.9で動かす