今からはじめるプログラミング28
コマンドプロンプトが苦手?僕もそうですが、まぁ仕事使わざるを得ない状態になることはたぶんたくさんあります。システムエンジニアとかプログラマになるとすればの話ですが。
とはいえ、「りくつ?」てきな部分を知らなければ仕事にならないとも思いますので、コマンドを利用したバッチを作成する場合のパターンというか、コツというか。。。
大体の流れとしては、
1・コマンド発行
2・実行結果取得
3・実行結果の編集・加工
4・結果から何かをする
というのがバッチのパターンで多い感じです。
例えば、「pingコマンドで生き死にを監視する。」ということをする場合、pingコマンドを発行、pingコマンドの結果を取得(ファイルに落としたり、linuxだったら、sedコマンドを組み合わせて、結果をそのまま加工してしまい、timeoutなどのキーワードを検知すれば、pingを通しに行ったマシン(PCだったりサーバだったり、あるいはルータなどのネットワーク機器だったり)の状態を「死んでいる(停止している)」と判定する、という感じです。
細かいことを書き始めれば、サーバーなら、サービスが動いているかを判断するバッチを仕組んでおくということも行います。WEBサーバーのサービスが「生きている(動いている)」ことを確認するには、まずはサーバー自体の電源が入っていること、次に、WEBサービスのプログラム(WindowsならIIS、LinuxならApacheとかそんな感じ)のプログラムが「起動」していること、リクエストが「処理」されることまで判断しなければいけないかもしれません。
そんな感じです。まぁ前回と今回のプログラムはその触り程度かもしれませんが、実行結果を取得、加工の手前までをjavaでやってみた、そんな感じです。
とりあえず、前回に付け加えて、GUIで入力して、加工していませんが、結果を別の画面に表示するように修正しました。
ExecSystemCommand
------------------------------------
package sample13;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class ExecSystemCommand extends JFrame implements ActionListener, MouseListener {
/** コマンドのフィールド **/
private JTextField command = new JTextField();
/** コマンドパラメータのフィールド **/
private JTextField param1 = new JTextField();
/** コマンドパラメータ2つめのフィールド **/
private JTextField param2 = new JTextField();
/** 実行結果のフィールド **/
private JTextArea resultArea = new JTextArea();
/***
* 入力用画面
**/
public void showInputParamView() {
Container cont = this.getContentPane();
// ばらばらに配置してもわかりずらいので1列のグリッドで表示
cont.setLayout(new GridLayout(10, 1));
// ラベル
JLabel lblCommand = new JLabel("command");
JLabel lblParam1 = new JLabel("param1");
JLabel lblParam2 = new JLabel("param2");
// ボタン
JButton btnExec = new JButton("exec");
JButton btnEnd = new JButton("end");
btnExec.setActionCommand("exec");
btnEnd.setActionCommand("end");
btnExec.addActionListener(this);
btnEnd.addActionListener(this);
// マウスでの操作(TODO 実装)
param1.addMouseListener(this);
// 大きさを設定
lblCommand.setSize(new Dimension(20, 100));
lblParam1.setSize(new Dimension(20, 100));
param1.setSize(new Dimension(20, 100));
btnExec.setSize(new Dimension(20, 100));
btnEnd.setSize(new Dimension(20, 100));
this.command.setSize(new Dimension(20, 100));
this.param1.setSize(new Dimension(20, 100));
this.param2.setSize(new Dimension(20, 100));
// コンテナに追加
cont.add(lblCommand);
cont.add(command);
cont.add(lblParam1);
cont.add(param1);
cont.add(lblParam2);
cont.add(param2);
cont.add(btnExec);
cont.add(btnEnd);
// 画面の大きさは適当です
this.setSize(new Dimension(200, 400));
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
/**
* コマンドの実行をするメソッド
*
* @param こまんど
* @param ぱらめーた
* @param ぱらめーた2つめ
* @return 結果
**/
public boolean execCommand(String cmd, String prm1, String prm2) {
// String Command = { "ping", "./", "192.168.43.256" }; // 起動コマンドを指定する
// ひきすうからコマンド文字配列を生成
String Command = { cmd, prm1, prm2 };
Runtime runtime = Runtime.getRuntime(); // ランタイムオブジェクトを取得する
System.out.println("実行環境の取得"); // ランタイム取得
Process p = null;
try {
p = runtime.exec(Command); // 指定したコマンドを実行する
// p = runtime.exec("ping -c 2 192.168.43.256");
System.out.println("実行"); // 実行
try {
p.waitFor(); // プロセスの正常終了まで待機させる
System.out.println("プロセス終了待ち"); // 終了待ち
} catch (InterruptedException e) {
e.printStackTrace();
}
InputStream is = p.getInputStream(); // プロセスの結果を変数に格納する
String enc = System.getProperty("sun.jnu.encoding");// エンコード取得
InputStreamReader isr = new InputStreamReader(is, enc);
BufferedReader br = new BufferedReader(isr); // テキスト読み込みを行えるようにする
System.out.println("実行結果読み込み準備"); // 実行結果準備
while (true) {
String line;
line = br.readLine();
if (line == null) {
System.out.println("実行結果がから"); // 実行結果がから
break; // 全ての行を読み切ったら抜ける
} else {
System.out.println("line : " + line); // 実行結果を表示
// テキストフィールドには「追加」する
String text = this.resultArea.getText();
text += line + "\r\n";
this.resultArea.setText(text);
}
}
} catch (IOException e) {
e.printStackTrace();
return false;
}
return true;
}
public static void main(String[] args) {
ExecSystemCommand execSystemCommand = new ExecSystemCommand();
execSystemCommand.showInputParamView();
}
/**
* ボタンを押した時の挙動
*
* @Override
**/
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
String command = e.getActionCommand();
// 実行ボタン
if ("exec".equals(command)) {
// 実行結果エリアのクリア
this.resultArea.setText("");
// 入力値取得
String cmd = this.command.getText();
String param1 = this.param1.getText();
String param2 = this.param2.getText();
// 実行
boolean res = this.execCommand(cmd, param1, param2);
// 実行結果画面の構築
JFrame resultFrame = new JFrame();
resultFrame.setSize(600, 400);
if (!res) {
// 実行結果の判定がだめだった
this.resultArea.setText("じっこうできなかた");
}
// 表示仕切れない場合のスクロール
JScrollPane scroll = new JScrollPane(this.resultArea);
resultFrame.getContentPane().add(scroll);
// 罰ボタンはとじるだけ
resultFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
// 表示
resultFrame.setVisible(true);
}
// 終了ボタン
if ("end".equals(command)) {
this.setVisible(false);
System.exit(0);
}
}
@Override
public void mouseClicked(MouseEvent e) {
// TODO テキストフィールドをクリックするとフォルダ選択ダイアログで入力する
System.out.println("file actions");
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int res = fileChooser.showOpenDialog(this);
if (res == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
this.param1.setText(file.getAbsolutePath());
}
}
@Override
public void mousePressed(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent e) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
}
------------------------------------
まぁコマンド自体のことを別に調べなければ動かないんですが。。。
とりあえずmacだと、コマンドに
ls
パラメータのひとつめに
./
といれて実行するとlsコマンドが実行できます。