yuu_nkjm blog
2011-02-06(Sun) [長年日記] 編集
[Windows][bat] バッチファイルで呼び出したコマンドの標準出力,標準エラーがリダイレクトできない
リダイレクト成功
(1)
SET CONF_DIR="conf/"
java ^
info.nkjm.yuu.Generator %CONF_DIR% 2>%SCRIPT_LOCATED_DIR%/syserr.log
(2)
SET CONF_DIR="conf/"
java ^
info.nkjm.yuu.Generator ^
%CONF_DIR% 2>%SCRIPT_LOCATED_DIR%/syserr.log
(3)
java ^
info.nkjm.yuu.Generator ^
conf/ 2>%SCRIPT_LOCATED_DIR%/syserr.log
(4)
SET CONF_DIR=conf/
java ^
info.nkjm.yuu.Generator ^
%CONF_DIR% 2>%SCRIPT_LOCATED_DIR%/syserr.log
リダイレクト失敗
(5)
SET CONF_DIR="conf/"
java ^
info.nkjm.yuu.Generator ^
%CONF_DIR% 2>%SCRIPT_LOCATED_DIR%/syserr.log
(6)
java ^
info.nkjm.yuu.Generator ^
"conf/" 2>%SCRIPT_LOCATED_DIR%/syserr.log
まとめ
(1)が成功で(5)が失敗なのが意味不明だった.(4)と(5)の差から,変数CONF_DIRにダブルクォーテーションで囲んだディレクトリ名を格納していることが原因と分かる.エディタにハイライトして欲しいからって無駄にダブルクォーテーションで囲ったのが敗因か….
(一)
java -version 2>ver1.log
(二)
java "-version" 2>ver2.log
(三)
""java ""-version" 2>ver3.log"
(四)
""java ""-version" "2>ver4.log""
(五)
""java ""-version ""2>ver5.log""
上記の例では,(三)だけlogが作成されない.自分としては(二)を書いたつもりだったが,(三)のように解釈されてしまったんだと思う.
2011-02-05(Sat) [長年日記] 編集
[bash][Linux][Java] シェルスクリプトの設置場所に移動してからのコマンド実行
状況
"/home/hoge/deep/path/project/sh/"という位置にJavaプロジェクトの起動スクリプトを置きたい.Javaのクラスパスの関係から,"/home/hoge/deep/path/project/"でjavaコマンドを発行したい.
スクリプト
起動スクリプトとしてboot.shを作成し,"/home/hoge/deep/path/project/sh/"に設置する.
シェルスクリプトの$0という環境変数には,スクリプトの相対パス付ファイル名が入っている.dirnameコマンドを使って,そこからファイル名を取り除いている.
以下では,全てを絶対パスに変換してから渡しているが,Javaに渡す引数は絶対パスではなく,javaコマンドを実行するパスからの相対パスにした方が良いかもしれない.
#!/bin/bash
SCRIPT_CALLED_DIR=`pwd`
echo This script is called from ${SCRIPT_CALLED_DIR}
SCRIPT_LOCATED_DIR=${SCRIPT_CALLED_DIR}/`dirname $0`
echo This script is located at ${SCRIPT_LOCATED_DIR}
cd ${SCRIPT_LOCATED_DIR}
echo Move to script dir ${SCRIPT_LOCATED_DIR}
cd ../
PROJECT_DIR=`pwd`
echo Move to Project dir ${PROJECT_DIR}
`java -cp bin:jar/log4j-1.2.15.jar info.nkjm.yuu.Hoge`
実行結果
どこからboot.shを実行しても,javaコマンドを実行したい"/home/hoge/deep/path/project/"に移動できている.
[hoge@info /home/hoge]$ deep/path/project/sh/boot.sh
This script is called from /home/nkjm
This script is located at /home/hoge/deep/path/project/sh
Move to script dir /home/hoge/deep/path/project/sh
Move to Project dir /home/hoge/deep/path/project
[hoge@info /home/hoge/deep/path]$ project/sh/boot.sh
This script is called from /home/hoge/deep/path
This script is located at /home/hoge/deep/path/project/sh
Move to script dir /home/hoge/deep/path/project/sh
Move to Project dir /home/hoge/deep/path/project
関連ページ
- この記事のwindows版?バッチファイルが存在するディレクトリへ移動する
-
shスクリプト内で安全に相対パスを使うで紹介されているように,
というのを定番にしても良いかも.#!/bin/bash SCRIPT_DIR=`dirname $0` cd $SCRIPT_DIR # これ以下に処理を書く
2011-01-18(Tue) [長年日記] 編集
[Profiler][JVM][Java][Eclipse] Javaのプロファイラ Java VisualVM
Java1.6以降のSDKをダウンロードするとbin以下にjvisualvm.exeというプロファイラが同梱されている.EclipseのTPTPプラグインを使ってたけど,こっちの方が分かりやすかった.
プログラムの監視
- Java VisualVM(jvisualvm.exe)を起動する.
- 監視対象としたいプログラムを起動する.
- VisualVMの左ペインのローカルセクションに,監視対象としたいプログラムが表示されたら,右クリックして「開く」を選択する.
- 監視タブを開くと,CPUやヒープの利用状況を見ることができる.スレッドタブを開くと,スレッドの利用状況を見ることができる.
CPU時間をサンプリングする
- サンプラタブを開く.CPUボタンをクリックするとサンプリングが開始される.
- 適当な時間が経過したあと,スナップショットボタンを押すとサンプリング結果が表示される.
- 監視対象が終了すると左ペインからプログラムが消えてしまうので,適当なタイミングで右クリックメニューから「アプリケーションのダンプ」を選んでおいた方が良さそう.
ヒープダンプする
- 左ペインから,ヒープをダンプしたいプログラムを右クリックし,ヒープダンプを選ぶ.
- ダンプしたファイルは,Eclipse Memory Analyzerプラグインで見るのが良さそう.IBM HeapAnalyzerも試して見たけど,Eclipse Memory Analyzerの方が直感で操作できた.
関連ページ
- 「Java SE 6完全攻略」管理ツールの集大成 - VisualVM その2 - Java技術最前線:ITpro 「Java SE 6完全攻略」管理ツールの集大成 - VisualVM その3 - Java技術最前線:ITpro


