[linux]rshのタイムアウト

残念ながらRHEL(RedHat)のrshコマンドにはタイムアウトのオプションが実装されていない。
rsh実行中にOSPFなどの動的ルーティングで経路が変わったりネットワークの状態に変化があった場合、
rshコマンドのパケットが戻ってこれずに、いつまで経ってもrshコマンドが終了しないという困った状態になる。
rshコマンドのタイムアウトが実装されていない場合の回避方法。
スクリプト使います。
ポイントは

  • rshをバックグラウンド実行
  • bashの特殊変数SECONDSを使用して、スクリプト開始からの経過時間を取得し、それを利用する

です。

#!/bin/bash
# タイムアウト秒数指定
timeoutsec=120
rsh "リモートコマンド" &
# バックグラウンド実行(rsh)のpidを取得
bpid=$!
startsec=${SECONDS}
while [[ 1 == 1 ]]
do
    # rshコマンド終了チェック
    stdout=$( ps auwwwwx | egrep "^.+[[:space:]]${bpid}[[:space:]]")
    if [[ -z "${stdout}" ]];then
        # 終了している
    	break
    fi
    # 経過分数を取得
    nowsec=${SECONDS}
    # rsh開始からの経過分数取得
    (( divsec=${nowsec}-${startsec} ))
    if (( ${divsec} > ${timeoutsec} ));then
    	# タイムアウト
    	kill -9 ${bpid}
    fi
    sleep 10
done

 

[tomcat]tomcatがフリーズしたときの原因究明方法(完全自分用メモ)

tomcatがフリーズしたときの原因究明方法
tomcatのプロセスが生きてるのに、tomcatが反応しないときのフリーズ原因究明方法は、tomcatのプロセス(java)に対してSIGQUITシグナルを送信してJavaスレッドダンプを出力させて、それを見て無限ループもしくはデットロックしている場所を見つける。
Javaスレッドダンプはtomcatからみて標準出力、つまりcatalina.outに出力される。
Javaスレッドダンプには、出力時点で実行中のスレッドの情報(実行状態およびソース上の実行箇所)、Javaのデットロックの情報が出力されている。

# pid=$( ps auwwwwx | egrep “^tomcat.+java ” | grep -v grep | awk ‘{print $2}’ )
# kill -3 ${pid}
# less /usr/local/tomcat/logs/catalina.out

clamdが起動しない・・・

clamdが起動しない

# service clamd start
clamd を起動中: /bin/bash: line 1: 14616 File size limit exceeded/usr/local/sbin/clamd [失敗]

でも

# /usr/local/sbin/clamd
# echo $?
0

では起動する。
この差はいったい・・・
このような場合の基本、ログを見てみる。
起動失敗パターン

# less /var/log/clamd.log
Sat Apr 11 01:07:07 2009 -> +++ Started at Sat Apr 11 01:07:07 2009
Sat Apr 11 01:07:07 2009 -> clamd daemon 0.95.1 (OS: linux-gnu, ARCH: i386, CPU: i686)
Sat Apr 11 01:07:07 2009 -> Log file size limited to 2097152 bytes.
Sat Apr 11 01:07:07 2009 -> Reading databases from /var/lib/clamav
Sat Apr 11 01:07:07 2009 -> Not loading PUA signatures.

こちらは成功パターン

# less /var/log/clamd.log
Sat Apr 11 01:08:17 2009 -> +++ Started at Sat Apr 11 01:08:17 2009
Sat Apr 11 01:08:17 2009 -> clamd daemon 0.95.1 (OS: linux-gnu, ARCH: i386, CPU: i686)
Sat Apr 11 01:08:17 2009 -> Log file size limited to 2097152 bytes.
Sat Apr 11 01:08:17 2009 -> Reading databases from /var/lib/clamav
Sat Apr 11 01:08:17 2009 -> Not loading PUA signatures.
Sat Apr 11 01:08:17 2009 -> Not loading PUA signatures.
Sat Apr 11 01:08:20 2009 -> Loaded 538775 signatures.
Sat Apr 11 01:08:20 2009 -> LOCAL: Unix socket file /tmp/clamd.socket
Sat Apr 11 01:08:20 2009 -> LOCAL: Setting connection queue length to 15
Sat Apr 11 01:08:20 2009 -> Limits: Global size limit set to 104857600 bytes.
Sat Apr 11 01:08:20 2009 -> Limits: File size limit set to 26214400 bytes.
Sat Apr 11 01:08:20 2009 -> Limits: Recursion level limit set to 16.
Sat Apr 11 01:08:20 2009 -> Limits: Files limit set to 10000.
Sat Apr 11 01:08:20 2009 -> Archive support enabled.
Sat Apr 11 01:08:20 2009 -> Algorithmic detection enabled.
:(以下省略)

失敗パターンはシグネチャを読み込めていない??
どこでこけてるのかわからないので、起動スクリプトをデバッグモードで実行してみる

# bash -vx /etc/init.d/clamd
:(省略)
clamd を起動中: + ulimit -f 20000
+ LANG=
+ daemon /usr/local/sbin/clamd
:(省略)
+ /bin/bash -c ‘ulimit -S -c 0 >/dev/null 2>&1 ; /usr/local/sbin/clamd’
/bin/bash: line 1: 14503 File size limit exceeded/usr/local/sbin/clamd
+ ‘[‘ 153 -eq 0 ‘]’
+ failure ‘clamd 起動’
:(省略)

このところどころで出てくるulimitって何ですか??
さっきの/usr/local/sbin/clamdを直接実行したときは起動できたのでulimitが非常にくさい!
で、さっきのログを見た結果、シグネチャが読み込めていない。
シグネチャのサイズがでかすぎる??

# ls -l /var/tmp/clamav-0cae8acb8c9855ce5c67f55328bfce6e:
合計 25380
-rw-rw-rw- 1 root root 17992 4月 11 01:26 COPYING
-rw-rw-rw- 1 root root 4725917 4月 11 01:26 main.db
-rw-rw-rw- 1 root root 716040 4月 11 01:26 main.hdb
-rw-rw-rw- 1 root root 318 4月 11 01:26 main.info
-rw-rw-rw- 1 root root 20480000 4月 11 01:26 main.mdb

20MB??この数字、起動スクリプトをデバッグしたときにどこかにあったよな・・・

# less /etc/init.d/clamd
:(省略)
start() {
echo -n $”Starting $prog: ”
# Don’t allow files larger than 20M to be created, to limit DoS
# Needs to be large enough to extract the signature files
ulimit -f 20000
LANG= daemon $progdir/$prog
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/clamd
return $RETVAL
}
:(省略)

20480000byte ギリギリアウト??
なので/etc/init.d/clamd 中の ulimit -f の値を24000にしてみる。

# vi /etc/init.d/clamd
:(省略)
start() {
echo -n $”Starting $prog: ”
# Don’t allow files larger than 20M to be created, to limit DoS
# Needs to be large enough to extract the signature files
ulimit -f 24000
LANG= daemon $progdir/$prog
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/clamd
return $RETVAL
}
:(省略)

起動

# service clamd start
clamd を起動中: [ OK ]

起動できた!
原因はシグネチャファイルのサイズが起動スクリプトで定義されているファイルサイズ制限より大きかったから。
以上

[linux]コンパイル時に「ld: cannot find -l」となるときの解決方法

linux(Redhat系)にて、ソフトウェアインストールのコンパイル時に

/usr/bin/ld: cannot find -lXext

というエラーメッセージが表示され、コンパイルが失敗してしまうときの 解決方法。
-lに続くパッケージ?のライブラリがないから上記のようなエラーが発生する。(configureのチェックをすり抜けちゃってるんですね・・・)
つまり、-l<パッケージ名> なら「lib<パッケージ名>-devel」というパッケージを用意すればよいことになる。
具体的には 「ld: cannot find -lXext」なら「libXext-devel」
どのパッケージかわからなければ

yum search lib<パッケージ名>

で表示されたパッケージを全てインストールしてしまえばよい。

qmail-scanner UTF-8 対応

qmail-scanner をUTF-8に対応させる方法
元々はEUC-JPにしか対応していないので、無理矢理./configureを実行すると以下のようなメッセージが表示させる

# ./configure (省略) –lang ja_JP.UTF-8 (省略) –add-dscr-hdrs yes –install
***** NOTE ******
Qmail-Scanner doesn’t have language translations for ja_JP.UTF-8,
– so defaulting to english…

○対処方法
UTF-8用のファイルをEUC-JPから変換して作成する。
以下のコマンドを実行

# cd qmail-scanner-2.02
# mkdir ./locale/ja_JP.UTF-8
# for file in $( ls ./locale/ja_JP.EUC/* )
# do
# iconv -f euc-jp -t UTF-8 ${file} | tee ./locale/ja_JP.UTF-8/${file##*/}
# done

./configure実行時に以下のオプションを指定

./configure (省略) –lang ja_JP.UTF-8 (省略)

Linuxで、ISOイメージからUSBブートLinux CD を作成

Linuxで、ISOイメージからUSBブートLinux CD を作成
CD-ROM(DVD)ドライブがないマシンで、レスキューモードで起動したいときなどに有効。(そのためだけに外付けCD-ROMドライブを買うのがもったいないなど)
USBメモリは、フラッシュメモリーやSDカード、コンパクトフラッシュ(CF)など。
1.USBメモリに領域作成

# fdisk /dev/sda
デバイスは正常な DOS 領域テーブルも、Sun, SGI や OSF ディスクラベルも
含んでいません
新たに DOS ディスクラベルを作成します。あなたが書き込みを決定するまで、変更は
メモリ内だけに残します。その後はもちろん以前の内容は修復不可能になります。
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります
コマンド (m でヘルプ): p
Disk /dev/sda: 260 MB, 260046848 bytes
8 heads, 62 sectors/track, 1024 cylinders
Units = シリンダ数 of 496 * 512 = 253952 bytes
デバイス Boot Start End Blocks Id System
コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本領域 (1-4)
p
領域番号 (1-4): 1
最初 シリンダ (1-1024, default 1):
Using default value 1
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-1024, default 1024):
Using default value 1024
コマンド (m でヘルプ): a
領域番号 (1-4): 1
コマンド (m でヘルプ): p
Disk /dev/sda: 260 MB, 260046848 bytes
8 heads, 62 sectors/track, 1024 cylinders
Units = シリンダ数 of 496 * 512 = 253952 bytes
デバイス Boot Start End Blocks Id System
コマンド (m でヘルプ): w
領域テーブルは交換されました!
ioctl() を呼び出して領域テーブルを再読込みします。
ディスクを同期させます。

2.USBメモリにext3ファイルシステム作成

# mke2fs -j /dev/sda1

3.Netwide Assembler インストール
後のsyslinuxのコンパイル時に必要

# yum install nasm.i386

4.syslinux インストール
syslinuxのサイトURL
http://syslinux.zytor.com
http://freshmeat.net/projects/syslinux/

# wget http://freshmeat.net/redir/syslinux/10177/url_tgz/syslinux-3.52.tar.gz
# tar zxvf syslinux-3.52.tar.gz
# cd syslinux-3.52
# make

5.extlinuxでUSBメモリにブートローダ(第2段階目)書き込み
extlinuxはsyslinuxのext2/3ファイルシステム用のサブセット

# cd extlinux
# mount /dev/sda1 /mnt/flash
# mkdir -p /mnt/flash/isolinux #・・・・isoイメージのディレクトリ構成にあわせる
# ./extlinux -i /mnt/flash/isolinux
/mnt/flash/isolinux is device /dev/sda1

6.USBメモリのマスターブートレコード(MBR)にブートローダ(第1段階目)書き込み
これを書き込まないと起動できない!

# cat ../mbr/mbr.bin > /dev/sda

7.isoイメージの内容のコピー

# mkdir /mnt/isoimg
# mount -o loop INSERT-1.3.9b_en.iso /mnt/isoimg
# cp -pR /mnt/isoimg/* /mnt/flash
# sync

8.USBメモリに書き込んだブートローダーの設定ファイルの名前変更

# mv /mnt/flash/isolinux/isolinux.cfg /mnt/flash/isolinux/extlinux.conf

9. ブート検証
USBメモリをさしたままマシンを再起動する
BIOS設定画面を起動し、ブートデバイスを「USB-HDD」に。「USB-HDD」が選択できない場合、BIOSがUSBメモリブートに対応していない・・・

VNCを使わずLinuxデスクトップのGUIアプリを使用する方法

linux/unixのディスプレイがないマシンで、GUIインストールしかできない場合に有効
クライアント(Windows)にはcygwin(X Windowあり)が必要
1.クライアント側のセットアップ・クライアント(Windows) cygwin bash console起動

#X Window起動
$ startx
# 外部マシンからのXの接続許可
$ xhost <LinuxマシンのIPアドレス> #無条件に許可するためにはアドレス部分を+にする

2.Linuxマシン側のセットアップ・Linuxマシン

$ export DISPLAY=<WindowsクライアントのIPアドレス>:0

3.確認・Linuxマシン(exportした端末で)

$ xload

Windowsクライアント側に画面が出たら成功