More from: linux

一応対策は講じてみた

先日のdovecotの自殺騒動。
毎週日曜の早朝にntpdが時刻を調整するとdovecotが自殺してしまうので、dovecotの生存確認をして、もし落ちていたら起動するスクリプトを書いた。
後はlogを見て落ちる時刻を調べ、その数分後にスクリプトを動かすようにcrontabを設定。
念のため時間を空けて2回スクリプトを動作させるようにしたので、これで大丈夫だとは思うんだけどなぁ。
スクリプトの動作自体は確認したけど、動作させるタイミングが問題だな(汗)。

←クリックしてくれると嬉しいです。

dovecotの自殺・・・

先週に引き続き昨日もpop3デーモン(dovecot)が死んでいた。
maillogには
”Time just moved backwards by xx seconds. This might cause a lot of problems, so I’ll just kill myself now.”
というのが残っていて、時刻が巻き戻ったために自殺したとのこと。
たしかにntpdで時刻合わせをやっているけど、こんなことで一々死なれていては実運用上困ってしまう。
時刻が巻き戻るとトラブルの元になるのは解からないでも無いけどさぁ・・・
解決策としてはntpdで時刻を一気に合わせるのではなく、徐々に合わせるようにするか、時刻が巻き戻った後で生死を確認してdovecotを再起動するスクリプトを組むかのどちらか。
時刻が巻き戻るのは今のところ日曜日の早朝で、アクセスしてくる人が殆どいない時間帯だから、この時間帯に再起動のスクリプトを動かせば良さそうだな。

それにしても昨年までは時刻が大きく(20-30秒も)巻き戻ることは無かったんだけど、年明けから急に巻き戻るようになったのは何故だろう???

←クリックしてくれると嬉しいです。

ディスクフル?

ユーザーから「FAXがPCに入らず、紙で出てくる」という連絡が来た。
原因を調べるとFAXがデータを送るファイルサーバのディスクが満杯になっていたorz。
このディスク(というかパーティション)は500GBほど用意しておいたんだけど、FAXデータだけでなく他のパーティションに置いているユーザーディレクトリの共用のゴミ箱(.recycle)も置いてある。
このゴミ箱の中が整理されておらず、中には2年以上前に削除されたデータが残っていたりした。
このsamba用のゴミ箱を用意したのは私なんだけど、当初はディスクにかなり余裕があったので気にしていなかった(汗)。
取り敢えず古いファイルを30GBほど消して空き容量を確保したけど、このままではまた同じことが起きるのでゴミ箱の中の古いファイルを消すスクリプトを書いてcrontabに仕込んだ。
find ”ゴミ箱のあるディレクトリ” -mtime +730 -exec rm -v {} \;
深夜に動作するようにしたので、明日になったら空きが増えている筈なので確認しないとな。

←クリックしてくれると嬉しいです。

”/”デバイスを大きく出来ないかなぁ?

職場の古いサーバーのディスク容量を増やしたい・・・
しかもルートデバイスにあるディレクトリの容量を増やしたい。
他のデバイスだったら新規デバイスを作成してマウントし、そこにファイルをまるまるコピーしてからマウントし直せばなんとかなるけど、ルートデバイスではそうは行かないんだろうなぁ、、、
さて、どうやって拡張しようか。。。

←クリックしてくれると嬉しいです。

複数ファイル内の特定文字列の一括変換

Linuxで稼働させているサーバに置いてある特定のファイル群の内容を一部書き換える必要が生じた。
書き換える内容は特定の文字列を別の文字列に変換するだけなんだけど、なにせ書き換えが必要なファイルが数百個もある。
手作業で編集するには多すぎるので、なんか自動で出来ないかな?と思い調べてみると同じことを考える人はいるもので、ヒントどころか回答そのものがすぐに見つかった。
手順は一行のコマンド(実際にはパイプで接続した二つのコマンド)で非常に単純。
$grep -l ‘置換対象の文字列’ 置換対象のファイル群 | xargs sed -i.bak -e ‘s/置換対象の文字列/置換後の文字列/g’
要は書き換えが必要なファイルをgrepで探し出し、それをパイプでsedに渡すんだけど、その際にファイル名をパラメータで渡すためにxargsコマンドを使用している。
実際にやってみるとあっというまに数百個のファイルの編集が完了、いやぁ助かったなぁ(汗)。

←クリックしてくれると嬉しいです。

cronファイルの場所

linuxサーバのユーザーの移行に伴って、各ユーザーのcrontabの内容を確認する必要があった。
一人や二人ならそのユーザーでログインするか、スーパーユーザーでcrontab ユーザー名 -eで確認するんだけど、数十人分なのでちょっと面倒。
なので各ユーザーのcrontabの内容がどこにあるかをググって見たらすぐに見つかった。
/var/spoo/cron
というディレクトリにユーザー名のファイルがあって、その中身がcrontab -eで編集しているファイルそのもの。
所有権を見ると600だけど、スーパーユーザーならcatコマンドで中身を見ることは可能。
あー、これで楽になったなぁ。

←クリックしてくれると嬉しいです。

サーバ間のメール転送が上手くいかない・・・

メールサーバの移行に伴い、新旧サーバ間でのメールの転送が必要になった。
具体的には新サーバの特定ユーザー宛のメールを旧サーバに転送することになる。
そこで該当ユーザーの”.forward”ファイルに転送先の旧サーバのアドレスを書いたのだけど、
「sendmail deferred connection refused by XXX」(XXXは送信先、要は旧サーバ名)
のエラーとなり送信出来ない。
それもその筈、旧サーバは当初外部からのsmtp接続を受け付ける必要が無かったので、”sendmail.cf”の
「O DaemonPortOptions=Port=smtp,Addr=127.0.0.1, Name=MTA」
という項目がデフォルトのままだったために、外部からのsmtp接続を拒否していた。
ここにもう一行
「O DaemonPortOptions=Port=smtp,Addr=aaa.bbb.ccc.ddd, Name=MTA」(aaa.bbb.ccc.dddは自サーバの実際のIPアドレス)
という行を追加し、sendmailを再起動することで回避出来た。
ところがその後も新サーバ側からメールを送ると、
”553 5.3.5 system config error”
とか
”553 5.3.5 xxx.yyy.zzz. config error: mail loops back to me (MX problem?)”
というエラーが出てやはり送信出来ない(汗)。
これらのエラーは”/etc/mail/local-host-names”ファイルに関係する全てのサーバ名(ホスト名、ホスト名+ドメイン名)を追加で記述しsendmailを再起動することで解消出来た。
また
”Relaying denied”
も出ていたので、これは”/etc/mail/access”ファイルにリレーを受け付けるホスト(要は新サーバ)のIPアドレス+”RELAY”を記述し、makeし直すことで解決した。

上記の設定変更でようやく新サーバから旧サーバへのメールの転送が可能になったので、ようやく落ち着いたよ(汗)。

←クリックしてくれると嬉しいです。

なんとか落ち着いたかな?

先日から進めていたメールサーバの移行作業が一段落した。
まだ全てのアカウントを移行したわけではないが、全体の何割かのアカウントを移行したところ元のサーバの負荷が下がり、メールの配信が通常通り行えるようになったため。
残りのアカウントの中には複雑にaliasesを切っているのもあるから、時間をかけてじっくり移行していこう。

←クリックしてくれると嬉しいです。

telnetで接続できなくなった(汗)

職場のメール受信用サーバが最近調子が悪いので新たに構築したサーバに移行中。
ところが移行作業二日目の朝になるとPCからtelnetでサーバに接続しようとすると、
「getaddrinfo: localhost Name or service not known Connection closed by foreign host.」
というエラーメッセージが出て接続できなくなってしまった。
早速このエラーメッセージでググって見ると、どうも/etc/hostsファイルの記述(だけでは無いらしいが)に問題があるようだ。
そこを修正すればOKらしいんだけど、作業をするにはコンソールからログインしなければならない。
サーバを設置してある部屋に行って/etc/hostsファイルを見ると、/etc/sysconfig/networkファイルに書いてあるホスト名と異なっていた(汗)。
さっそく/etc/hostsファイル内のホスト名を書き直すとtelnetでの接続が復活した。
うーん、前日の作業で修正を間違っていたのかなぁ???

←クリックしてくれると嬉しいです。

ユーザーパスワードをシェルスクリプトで設定

サーバー上のユーザーアカウントを別サーバーに移行する必要が生じた。
サーバー自体をまるごとコピーすれば簡単なんだけど、OSのバージョンを新しくしたサーバーへの移行なのでそれが出来ない。
つまり新しいサーバー上でユーザーアカウントを新たに作成しなければならない。
いや、/etc/passwdや/etc/shadowや/etc/groupの必要部分をコピーする方法もあるんだけど、OSのバージョンがかなり違ってちょっと怖いので今回はやらないつもり(汗)

ユーザーの作成そのものは以前書いた「ユーザー設定の移行(備忘録)」の手順で行えば良いのだけど、この記事を書いた時はパスワードの設定をどうすれば簡略化出来るか判らなかった。
その後調べていたら、
# echo [パスワード] | passwd –stdin [ユーザ名]
とすれば、コマンドラインから一発でパスワードを入力できることが判ったので、これを移行するユーザー分だけスクリプトに書いて実行すれば楽に出来るなぁ。

←クリックしてくれると嬉しいです。