ご注意ください

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

オンラインゲーム関連

著作権表示

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

[HP-UX] dateコマンドが違う

HP-UXに実装されているdateコマンドは、Linuxのそれとはどうやら違うものらしい。そのため、オプションで「--date '5 days ago'」を指定したら、怒られた…。

ファイルの更新日を見て、5日以上前のものは削除するようなシェルがあったのですが、どうやらHP-UX上ではダメそう。

GNU Shellutilsをインストールすればいいらしいけど、システム上それは無理なので、他の方法を探す。

となると、findで削除してしまえばいいや、と、以下のようなコマンドを試してみた。

find ${LOGDIR}/LOG*.* -type f -mtime +5 -exec rm -r {} \; >/dev/null 2>&1

とりあえず置き換えは可能ですが、findだと「+5」と指定すると5*24時間以上前のものを削除するので、最終更新日時によっては削除される条件が微妙に変わる。

ということで、時刻は「0:00」を指定してもらえるように、パラメータに「-daystart」をつけてみると…ダメ。HP-UX上では「-daystart」は使えないっぽい。

独自路線すぎて使いにくいOSですこと…。

[HP-UX] PHPを動かしてOracleと接続するまで

HP-UXって、何でもかんでも独自な感じだから嫌い。でも仕事上使わざるを得ないのが辛いところ。

今回はHP-UXでPHPを動かして、さらにOracleとの接続までの設定を行ったので、手順をメモメモ。

とりあえずHP-UXは、HP-UX Itanium 11i 11.23 というもの。


まずは、/opt/hpws/apache/conf/httpd.conf を設定。PHPのモジュールがコメントアウトされているので外すだけ。環境によってはユーザーやグループの変更も必要。

#LoadModule php5_module        modules/libphp5.so
      ↓
LoadModule php5_module        modules/libphp5.so

次に、/opt/hpws/apache/conf/php.ini を設定。以下の項目を環境に合わせて編集する。コメントアウトされているものはコメントアウトを外す。今回はシフトJISを使ったので、SJISを指定している。

date.timezone = Asia/Tokyo
register_globals = On
magic_quotes_gpc = Off
default_charset = "SJIS"
mbstring.language = Japanese
mbstring.internal_encoding = SJIS
mbstring.http_input = auto
mbstring.http_output = SJIS
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_character = none
extension=oci8.sl

続いて、/opt/hpws/apache/bin/apachectlを修正。ライブラリパスを追加し、さらにOracle固有の設定を追加した。

#export SHLIB_PATH=$ORACLE_HOME/lib:$APACHE_PREFIX/php/lib/php/extensions:$SHLIB_PATH
      ↓
export SHLIB_PATH=$ORACLE_HOME/lib:$APACHE_PREFIX/php/lib/php/extensions:$SHLIB_PATH
export ORACLE_BASE=/opt/app/oracle
export ORACLE_HOME=$ORACLE_BASE/10.2.0/db_1
export TNS_ADMIN=$ORACLE_HOME/network/admin
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export NLS_LANG=Japanese_Japan.JA16SJIS
export PATH=$ORACLE_HOME/bin:$PATH

この状態でapacheを再起動して接続してみると、OCILogon()がない!と怒られた。どうやらライブラリのバージョンが違うために、見つからないらしい。シンボリックリンクを張ることで対処可能。

# su - oracle
% cd /opt/app/oracle/10.2.0/db_1/lib
% ln -s libclntsh.so.10.1 libclntsh.so.9.0

もう一度apacheを再起動して、ブラウザからアクセスし、Oracleとの接続が確認できた。

Linuxとは一味違った設定方法だったので結構大変でしたが、そのぶんつながるようになったときの嬉しさは大きいかも?(笑)

余談。

apacheを自動起動にする場合は、/etc/rc.config.d/hpws_apacheconf というファイルの HPWS_APACHE_START の値を 1 にすればイイ。

[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

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

いやはや、目からウロコでした。

lsコマンドの色

RHEL5 に teraterm などでログインしてlsコマンドを叩くと、デフォルトの環境ではディレクトリが青字、リンボリックリンクが水色、シェルなどは緑色で表示されると思いますが、なぜかaliasでコマンドをカスタマイズすると、このディレクトリやリンクなどの色分けがされなくなってしまうという現象に悩まされました。

…実際は悩むほどではなく、なんで色分けされなくなってるんだろうな~、くらいでしたが(笑)

ちなみに、lsコマンドに対しては

alias ls='ls -F'

とやっていただけ。環境変数の LS_COLORS には手を加えていないし、/etc/DIR_COLORS にも手を加えていない。もちろん、~/.dir_color も手を加えていない…どころか、作成すらしていないし。

うーん、じゃあ誰がどこでどうやって色を無効にしているんだ…。

と思って、何気なく which コマンドを試してみたら…。

$ which ls
alias ls='ls -F'
        /bin/ls

おや、which コマンドってエイリアスも表示されるんだ。知らなかった。んじゃログイン直後はどうなっているんだろう。

$ which ls
alias ls='ls --color=tty'
        /bin/ls

なんと、パラメータで指定されていたようで。

ということで、試しに

alias ls='ls -F --color=tty'

としてみたら、ちゃんと色分けされつつも、ディレクトリ記号「/」やシンボリックリンク記号「@」などが表示されました。

Fedora や Debian などでも color パラメータは使えたけど、AIX や Solaris などの UNIX では使えませんでした。Linux系の ls固有のオプションなのかな。

またひとつ勉強になりました。

[Shell] 標準出力と標準エラー出力

調べればたくさんのサイトが検索結果に出てくると思うけど、とりあえず備忘録ということで、標準エラー出力をファイルに出力する方法。

標準エラー出力だけをファイルに出力させたい場合は、

$ test.sh 2> logfile.log

でよい。標準出力も出したい場合は、

$ touch logfile.log
$ test.sh 1>> logfile.log 2>> logfile.log

でよさそう。どちらが先に書き出されるかわからないので、前もってログファイルを作成しておいたほうがいいかも。

画面とファイルの両方に出力する場合は、標準出力も混ざるけど

$ test.sh 2>&1 | tee logfile.log

とすればよい。

じゃあ実際に動かしてみるとどうなるかというと…。

まず標準出力と標準エラー出力を出すためのプログラムを作って確認。

$ cat HelloWorld.java
import java.util.List;
public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello World");
    List<String> list = null;
    System.out.println(list.get(0));
  }
}

コンパイルして

$ javac HelloWorld.java

実行。

$ java HelloWorld 2> logfile.log
Hello World
$ cat logfile.log
Exception in thread "main" java.lang.NullPointerException
        at HelloWorld.main(HelloWorld.java:6)

tee を使って画面とファイル出力。

$ java HelloWorld 2>&1 | tee logfile.log
Hello World
Exception in thread "main" java.lang.NullPointerException
        at HelloWorld.main(HelloWorld.java:6)
$ cat logfile.log
Hello World
Exception in thread "main" java.lang.NullPointerException
        at HelloWorld.main(HelloWorld.java:6)

tee を使って標準エラーだけをファイル出力する方法は、ちょっと調べてみたけど面倒そうなので省略…。

標準出力とファイル出力

kshで、とあるJavaプログラムの起動シェルを作っていたところ、起動時に標準出力に表示されるメッセージをファイルにも出力してほしい、というお願いが来ました。

リダイレクトとか駆使して何とかしてくれ、って感じだったのですが、確か両方に出力できるコマンドがあったようななかったような…。記憶を頼りに、ファイル操作関係のコマンドのmanをあさっていたら見つけたので、備忘録がてらメモメモ。

メモメモ…と言いつつ、実際は一行で終わってしまう程度のことですが、せっかくなのでサンプルスクリプトも載せておこう(´Д`)

#!/bin/ksh
echo "Hello World!!" | tee sample.log

こんな感じのシェルスクリプトを組んで動かしてみると、画面に「Hello World!!」と表示しつつ、sample.log というファイルにも「Hello World!!」と出力します。もしファイルが既に存在している場合は、上書きされます。

上書きではなく、今あるファイルに追記したい場合は、

#!/bin/ksh
echo "Hello World!!" | tee -a sample.log

とすることで追記モードに。もしファイルが存在しなければ作ってくれるので、ログファイルに出力させる場合は常にこのオプションをつけておくといいかも。

リダイレクトを使ってファイル出力する方がお手軽でいいけど、こちらのコマンドを使ったほうがよりプログラムっぽい感じがするのは気のせいかな?気のせいですね、はい(´Д`)

ちなみに、上記サンプルでは ksh を使っていますが、シェルならどれでも使えると思います。ksh、bash、cshでは確認済み。

kshからbashへ

お仕事の話。

ある理由から、今までkshで動かしていたシェルスクリプトをbashで動かすことになった。

どちらもBシェル系なので、さほど大きな違いはなく、ほぼそのままで動くことには動くのですが・・・一部書き換えないといけない部分があったり。

備忘録を兼ねて、メモメモ。

まずはお約束な部分で、1行目。

#!/bin/ksh

となっているところを、

#!/bin/bash

に書き換える。こんなこと忘れる訳がない!と言いたいところですが、大量のシェルスクリプトを手動で書き換えていく場合に、よく忘れる部分(笑)


次に、改行コード。echoコマンドなどの中で改行を入れるために「\n」を入れていることがありますが、bashはこれを文字として出力してしまうので、書き換えてあげないといけない。

例えば、

echo "\nエラー発生!\n"

という行があったとすると、

echo $'\nエラー発生!\n'

と書き換えてあげることで、bashでも改行コードとして認識してくれる。

とりあえず、そんな感じ。

kshで補完とコマンド履歴

新プロジェクトに移り、かなり久しぶりにAIXを使うことになったわけですが、今回使うシェルがkshということで、コマンド履歴の出し方とか、Linuxでいうタブ補完のやり方を忘れてしまっていて困りました。

今後いつまた同じようなことになるかわからないので、メモを残しておかねばなりませぬ(笑)

◆コマンド履歴の出し方
  Ctrl+p(Linux上のカーソルキー上)
  Ctrl+n(Linux上のカーソルキー下)

◆コマンド入力補完(Linux上でのタブ補完)
  set -o vi(ESC1回と'¥'で補完)
  set -o emacs(ESCを2回たたくと補完、ESC1回と'='で補完候補表示)

コマンド入力補完は、emacsの方が便利かも。同じキーを2回たたく方が早いし、候補を表示できるのが大きい。でも、やっぱりLinuxの方が長く使っているから、手が自然とカーソルキー上下やタブキーを押しちゃうんだよなぁ・・・しくしく。

[Solaris] Solarisサーバの謎 <追記編>

昨日、電源管理デーモン(powerd)の設定ファイルのautoshutdownをコメントアウトした結果、どうやら今日はサスペンドモードに入っていなかった模様。

ということで、設定が合っていたのかな。と思いきや、autopmの設定もどうやら必要だった模様。むしろ、/etc/power.confには、以下のエントリだけ記述しておけばいいらしい。

autopm          disable

このエントリのみにすることで、低電力モードを使わず、常にフルパワーで動作するようになるということだ。サーバ用途がメインのOSなんだから、デフォルト設定でフルパワーにして欲しいものだ。

・・・と思ったけど、もしかして・・・ちゃんと設定をするまでは一定時間でサスペンドにすることで、外部からの思わぬ攻撃を最小限に食い止める、という意味があるのかな~。管理者がきちんとセキュリティに関する設定を行い、自分の手でフルパワーモードに変更することで「セットアップ完了!」とする、という意味があるのかな、なんてね。

何はともあれ、これで無事サーバとして稼動させることができました。

あ、設定ファイルを書き換えた後は、pmconfigを忘れずに(笑)
フォト
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      

最近のトラックバック