ご注意ください

  • 当ブログのコメントやトラックバックに、アカウントハックサイトや、そのようなサイトへリダイレクト(転送)される可能性が高いサイトへのリンクが時々貼られているようです。
    そのようなサイトへのリンクが貼られたコメント・トラックバックは、見つけ次第削除・禁止ワード登録していますが、今後も危険なサイトへのリンクが貼られる可能性がありますので、安易にリンク先へ飛ばないよう充分ご注意ください。

オンラインゲーム関連

著作権表示

  • 当ブログに記載されている
    会社名・製品名・システム名などは、
    各社の登録商標、もしくは商標です。

    当ブログ上の文章・写真・画像の
    無断転載、無断転用、直リンクなどは
    行わないでください。

    (C) 1998-2016 Vertex.
    (C) 2002-2016 SQUARE ENIX CO., LTD.
    (C) CAPCOM CO., LTD. 2007, 2016

    All Rights Reserved.
無料ブログはココログ

ルータとNASのログをsyslog転送

会社のルータとNASのログを保存するためにsyslogの設定をしたので、備忘録としてメモメモ。


Baffalo製の無線ルータが複数ありますが、ログは全てまとめて以下のファイルに出力させる。

/var/log/router

そして、NASのログは以下に出力させる。

/var/log/terastation

出力先ファイルは、あらかじめ touch で作成しておく。


さて、設定。

社内テスト用のWebサーバ(CentOS 5.11)を立てているので、このサーバにsyslogサーバを兼任させることに。すでにsyslogはインストールしてあるので、以下の通りに設定。

◆ /etc/syslog.conf に以下の行を追加。

# Router
local1.*        /var/log/router
# Terastation
local0.*        /var/log/terastation

Baffaloのルータはファシリティ「local1」で投げてくるとのことなので、「local1」は全てルータからのログとみなす。

Terastationはどうやら「local0」で取れるようなので、「local0」は全てTerastationからのログとみなす。


◆ /etc/sysconfig/syslog に赤字を追記

SYSLOGD_OPTIONS="-m 0 -r"


◆ /etc/logrotate.d/syslog に赤字を追記
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron /var/log/router /var/log/terastation {
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}


以上でsyslogを再起動すればOK。あとはルータやNAS側の設定で、ログ転送設定をすれば完了。

ツイッターで流れてきた話

電車内で電話をしている人の会話。

「親が死なないだと?子供は全員ぶっ殺してるのか?全員だよ全員。1人残らず殺してから親を殺さないとゾンビになるぞ!」

これを隣で聞いていたおばさんが震えていたらしい。

普通にこんな会話を聞いたら、そりゃ震えるだろう。ホラー映画かなにかかと思うかもしれない。どちらにしても、物騒な話なのは変わりないわけで。

でも、PG/SEの間では普通に会話に出てきたりする。

自分がやってきた仕事を例にすると、普段はメインプロセスとよばれる常駐型アプリが立ち上がっていて、何か処理要求が飛んでくると、このメインプロセス(親)がチャイルドプロセス(子)を立ち上げて、そちらに処理を任せる。

親プロセスは、子プロセスの処理が終わるのを待ち、子プロセスが処理を終えると、子プロセスを終了させる。

ただ、この「子プロセスを終了させる」処理が何らかの事情で終了できなかった場合、親プロセスは一定時間後に子プロセスをKillコマンドによって強制終了させる。この処理を直訳すると「殺す」になり、つまりは親プロセスが子プロセスを「殺す」のだ。

親プロセスが立ち上げた子プロセスは親側に処理を引き継いでから終了しないといけないので、逆に言えば「子プロセスが立ち上がっている状態では、親プロセスは(正常な処理上では)終了できない」状態にある。

そこで、例えば親プロセスに対してkillコマンドを投げてしまうとどうなるか。ほとんどの場合で、子プロセスが立ち上がったまま、親プロセスが強制終了して(死んで)しまう。

じゃあ、親プロセスがいなくなった状態で、子プロセスはどうなるか。子プロセスが終了する場合の処理を引き継ぐ親プロセスがいないので、子プロセスが完全に終了できないまま、宙ぶらりんになってしまう。この状態をゾンビプロセスという。

最初の電話の話をわかりやすくすると、「親プロセスが強制終了できないだと?子プロセスは全て強制終了しているのか?全部だよ全部。1つ残らず強制終了してから親プロセスを強制終了させないと、子プロセスがゾンビプロセスになってしまって残るぞ!」ということになる、と。

業界用語に近いものがあるのかなぁ。

解説になっていない解説でした(笑)

仮想PCにCentOS6.4インストール

LAMP環境で動作確認したいことがあったので、仮想PCにCentOS6.4をインストールしてみました。そのときの手順メモ…を書こうかと思ったけど、特に注意すべきこともないので、手順メモはナシ(笑)

とりあえずサイトからCentOS6.4の64bit版をダウンロードしてきて、VirtualBoxを使って仮想PCへ。

インストール時にWebサーバとMySQLをインストールするようにチェックを入れて、あとはインストール完了を待つだけ。インストール完了後はユーザーを作り、TeratermからSSHでログインして作業。

ここまで、設定という設定をしないですんなりできてしまうのは、やはり時代の流れですかねぇ。楽になったものだなぁ。

久しぶりのLinuxはうろ覚えの部分が多かったですが、考えるより先に手がコマンドを入力しているあたり、体に染み付いたOSなのかもしれない…。

PS3 Media Server

今までTVersityというDLNAサーバを使っていたのですが、最新バージョンにバージョンアップしたら突然PS3側から認識されなくなり、PCからも認識できなくなってしまったので、簡単な設定のみでISOファイルから共有できるというDLNAサー名「PS3 Media Server」を試してみることにしました。

このサーバアプリは、ホントに設定が簡単で…というか、共有フォルダの設定以外はそのままでもOKという、とにかく簡単なもの。

まずは公式サイト(http://ps3mediaserver.blogspot.com/)に行き、「PS3 Media Server vx.xx.x for Windows/Linux/OSX」というリンクをクリック。次のページで「pms-setup-windows-x.xx.x.exe」をダウンロード。x.xx.xの部分はバージョン番号で、自分がダウンロードしたときは1.30.1。

ダウンロードしたファイルを実行してインストールしたら、起動!もしPCにJavaがインストールされていなかったら、起動前に勝手にJavaのインストール画面を出してくれるので、別途用意する必要はナシ。

ステータス画面では、同一ネットワーク内にあるPS3やWindows Media PlayerなどのDLNAクライアントを自動で検索してくれ、おおよその接続速度まで表示してくれる。

設定が必要なのは「表示/共有設定」タブの中で、一番下にある「共有フォルダ」に共有したいISOファイルが置かれているフォルダを指定するだけ。その他表示設定などはお好みによって設定すればいいので、最初はデフォルトのままでいいかも。

実際にPS3 Media Serverを起動した状態で、PS3を起動してみると…ちゃんと認識されていました。ISOファイルを指定すれば、最初少し待たされるけれど問題なく再生される。

ISOファイル以外にも、MPEG4やMPEG2などの動画ファイルも共有できるので、TVersityからこちらに置き換えてしまってもよさそうな感じ。日本語にも対応しているしね。

詳しくはまとめWiki(http://www42.atwiki.jp/pms_ps3/)に載っていたので、ご参考に。

VirtualBoxのゲストOSにtelnet接続

ブリッジアダプタでホストのNICを指定して、ゲストOS内でホストOSと同じセグメントの固定IPを割り振ってしまえば、何の苦労もなくホストOSからゲストOSにtelnetだろうとFTPだろうとつながります。同じネットワーク内からは、あたかも別PCのように。

でもホストOSと同じセグメントに、割り振れるIPがもうなかったら…。もしくは、勝手にIPアドレスを割り振れる立場になかったら…。

ということで、ホストOSからゲストOSにtelnetするために、別の方法を試してみました。手順を忘れそうなのでメモメモ。

まず、ホストOSにネットワークカードを追加。といっても物理的に追加するわけじゃなくて、ループバックアダプタを追加します。

以下、ホストOSはWindowsXP SP3、ゲストOSはRedHat Enterprise Linux 5.3での手順。

  1. コントロールパネルから「ハードウェアの追加」を起動
  2. 「次へ」をクリック
  3. 「はい、ハードウェアを接続しています」を選択して「次へ」
  4. 「新しいハードウェアデバイスの追加」を選択して「次へ」
  5. 「一覧から選択したハードウェアをインストールする(詳細)」を選択して「次へ」
  6. 「ネットワークアダプタ」を選択して「次へ」
  7. 「Microsoft」「Microsoft Loopback Adapter」を選択して「次へ」
  8. 「次へ」をクリック
  9. インストールを完了させる

インストールしたループバックアダプタに固定IPアドレスを設定。例えば192.168.10.1。デフォルトゲートウェイやDNSは空欄でOK。

次にゲストOSにもネットワークアダプタを追加。ゲストOSが起動している場合は一旦終了させて、VirtualBoxのメイン画面から、ゲストOSを選択して設定画面を開く。

  1. ネットワークの「アダプタ2」をクリック
  2. 「ネットワークアダプタを有効化」をクリック
  3. 「割り当て」で「ブリッジアダプタ」を選択
  4. 「名前」で「Microsoft Loopback Adapter」を選択
  5. 「OK」をクリック

続いてゲストOSを起動し、eth1に固定IPアドレスを設定。ホストOSのループバックアダプタに設定したIPと同じセグメントでないとダメ。例えば192.168.10.100。デフォルトゲートウェイにはホストOSのループバックアダプタに設定したIPを指定。ここでは192.168.10.1。

あとはゲストOSのネットワークを再起動し、telnetサーバやFTPサーバを起動させれば、ホストOSから接続することができる。ここでは、telnetなら接続先に192.168.10.100。

bashで数値文字列判定

パラメータで受け取った値などが数値かどうかを判定する。数値以外の文字がひとつでも入っていればエラー。

CHAR=`expr "$1" : '\([0-9][0-9]*\)'`
if [ "$1" != "$CHAR" ]; then
    echo "数値以外の文字が入っています"
    exit 1
fi

忘れないようにメモメモ。

C言語のremove()とunlink()

ファイルを削除する処理を追加したとき、自分はいつもremove()を使っていたけど、ふと、unlink()と何が違うのかが気になったので調べてみた。

調べてみたと言っても、「Manpage remove」「Manpage unlink」というキーワードでググってみただけ。

linux.or.jpのマニュアルページによると、remove()はファイルを指定された場合は内部でunlink()を呼び、ディレクトリを指定された場合はrmdir()を呼ぶらしい。

ということは、通常はremove()を使っていてもいいし、明示的にファイルだけを削除対象とする、という意味でunlink()を使ってもいいようだ。

逆に、ディレクトリが指定されたら削除したくない、という場合は、remove()よりunlink()の方がいいのかな。unlink()でディレクトリを削除しようとすればエラーとしてEISDIRが返るようだし。

ディレクトリなのかファイルなのかは事前チェックするべきかもしれないけど…。

とりあえず備忘録としてメモメモ。


Manpage of REMOVE
Manpage of UNLINK

NICに複数IP設定

Linuxを普通に使っているだけではあまりお世話になることがないけど、固定IPを変更したときに移行期間を設けたり、開発で複数IPを使いたい場合に役に立つかも。

ということで、備忘録としてメモメモ。

◆条件◆
eth0のNICに、192.168.1.200 と 192.168.1.201 のIPを追加する


◆複数IPをエイリアスで一時的に設定する方法1
# ifconfig eth0:0 192.168.1.200
# ifconfig eth0:1 192.168.1.201


◆複数IPをエイリアスで一時的に設定する方法2(RedHatのみ)
# ip addr add 192.168.1.200/24 brd 192.168.1.255 dev eth0 label eth0:0
# ip addr add 192.168.1.201/24 brd 192.168.1.255 dev eth0 label eth0:1


◆複数IPをエイリアスで永続的に設定する方法
以下の2つのファイルを作成
  /etc/sysconfig/network-scripts/ifcfg-eth0:0
  /etc/sysconfig/network-scripts/ifcfg-eth0:1

中身はそれぞれ以下の通り
  # cat ifcfg-eth0:0
    DEVICE=eth0:0
    BOOTPROTO=none
    ONBOOT=yes
    TYPE=Ethernet
    IPADDR=192.168.1.200
    NETMASK=255.255.255.0
  # cat ifcfg-eth0:1
    DEVICE=eth0:1
    BOOTPROTO=none
    ONBOOT=yes
    TYPE=Ethernet
    IPADDR=192.168.1.201
    NETMASK=255.255.255.0

ネットワークの再起動
  # /etc/init.d/network restart


◆エイリアスではなく直接NICにIPを複数設定する方法
# ip addr add 192.168.1.200/24 brd 192.168.1.255 dev eth0
# ip addr add 192.168.1.201/24 brd 192.168.1.255 dev eth0


NICに直接IPを複数指定すると、ifconfigでは確認できないため、ipコマンドを使用して確認する。
# ip addr show dev eth0


ipコマンドで追加したIPを解除するには、以下のようにする。
# ip addr del 192.168.1.200 dev eth0
# ip addr del 192.168.1.201 dev eth0
もしくは、
# ip addr flush dev eth0
で一括解除

Linuxのロケール設定

理由はこうだから!とズバッと説明できなくて困ったこと。

RedHat Linux ES4で、デフォルトの文字コードが「ja_JP.UTF-8」になっているけど、localeコマンドで文字コードを確認してみると「ja_JP.utf8」はあるけど「ja_JP.UTF-8」というのはない。

でも、LANG="ja_JP.UTF-8" としても、LANG="ja_JP.utf8" としても、今のところ全く問題なく動いている。

localedefコマンドでロケールを定義するときに「ja_JP.UTF-8」とするか「ja_JP.utf8」とするかの違いだけだと思っていたけど、そうでもないらしい?

それぞれの指定方法は、一体何が違うんだろう…。

特に問題は発生していないけど、いつかまた同じ疑問にぶつかるかもしれないので、メモメモ。

[ksh] パラメータが上書きされる?

とあるシェルスクリプトで、パラメータが取得できない!とヘルプが来たので、調べてみました。

どんな感じのシェルかというと…そのままは載せられないので、多少改変していますが、だいたいこんな感じ。

#!/bin/ksh
cd `/usr/bin/dirname $0`
export HOME=$PWD
. $HOME/ENV
SHID=`/usr/bin/basename $0`
. $HOME/cmd/myenv $SHID
echo $#
echo $1 $2 $3

これを何度試しても、パラメータがひとつしか取れず、しかもSHIDの値が出てくる、と。そんなことがあるのか!と試してみると、確かにSHIDの値が表示されるだけ。

2行目からひとつずつコメントアウトさせながら動きを見ていくと、どうやらmyenvを呼んでいるところをコメントアウトすると、正常に3つのパラメータが取得できる。逆にmyenvの行だけを有効にしたときでも、パラメータはひとつしか取れない。

ということで、myenvが原因と判明。でもこのファイルはSHIDを元にexportしているだけで、特に悪さをしているわけでもないのに…。

試しに、myenvを呼ぶ部分を関数にしてみると、今度は問題なく動く。

#!/bin/ksh
cd `/usr/bin/dirname $0`
export HOME=$PWD
. $HOME/ENV
SHID=`/usr/bin/basename $0`

function func_myenv {
. $HOME/cmd/myenv $1
}

func_myenv $SHID
echo $#
echo $1 $2 $3

どうやら、メインシェルのパラメータ変数?を、サブシェルが上書きしてしまっている様子。だから関数内で実行させれば、メインシェルのパラメータが上書きされないので正常に動くのか…。

いやはや、目からウロコでした。
フォト
2017年5月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

最近のトラックバック