開発関連の覚書

■linux

■所有者の権限で実行する方法

バッチ処理等で、オーナー権限で実行させたい時は、以下のコマンドでパーミッションを変更する。
パーミッションを変更しても、オーナー権限で実行出来ない時には、別項目の方法で対応してみて下さい。

■パーミッションでの対応方法
chmod 4755 batch.class

■execlp関数を利用して、オーナー権限で実行する方法
以下の例では、db2コマンドで、sqlファイルを実行しています。
エラー処理などは、forkなどで作りこみが必要になると思います。
簡単な動作の説明をすると、シェルスクリ
■シェル側のソース
#!/bin/bash
#
LANG=ja_JP.sjis

echo ${BATCH_PATH}
if [ "${BATCH_PATH}" == "" ] ; then
  export BATCH_PATH=/home/java/test/
fi

argv[0]="/home/java/tmp/tmp.sql"
argv[1]="/home/java/tmp/batch.o"
argv[2]="connect to sampledb user db2inst1 using db2inst1;"
argv[3]="LOAD from ./test.csv of DEL INSERT INTO test_table set integrity pending cascade deferred;"
argv[4]="terminate;"

max=${#argv[@]}
n=0
until [ $n -eq $max ]
do
 c=$c${argv[$n]}' '
 n=$(($n + 1))
done

java -cp /home/java/batch.class ${c}

echo 'ret=' $?
if [ "$?" = "8" ] ; then
  exit 1
fi

exit 0

■linux側のソース。(ccでコンパイルして下さい。)
#include 
#include 

main()
{
    if ( execlp("db2", "db2", "-tvf", "./tmp.sql",NULL ) == -1 ) {
        perror("exec error");
        exit(1);
    } else {
        exit(0);
    }
}

■java側のソース

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Iterator;

/**
 * バッチ処理サンプル
 */
public class Batch {

  public Batch() {
  }

  public static void main(String argv[]) {

        ArrayList p_argList = new ArrayList();

        String p_line = "";
        for(int i=2; i 0 ) {
                p_argList.add(p_line);
                p_line="";
            }
        }

        try {

            // ファイルオブジェクトを生成する
            FileOutputStream fileOutputStream = new FileOutputStream(
                    argv[0] );
            OutputStreamWriter outputStreamWriter = new OutputStreamWriter(
                    fileOutputStream);
            BufferedWriter bufferedWriter = new BufferedWriter(
                    outputStreamWriter);

            Iterator p_ite = p_argList.iterator();
            while(p_ite.hasNext()) {
                p_line = (String)p_ite.next();
                bufferedWriter.write(p_line);
                bufferedWriter.newLine();
            }
            // ファイルオブジェクトを破棄する
            bufferedWriter.close();
            outputStreamWriter.close();
            fileOutputStream.close();
            // 一連のファイル処理はIOExceptionが発生する
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        if ( !shellExec(argv[1]) ) {
            System.exit(8);
        }

        System.exit(0);

    }

    /**
     * パラメータで指定されたシェルを実行する
     */
    private static boolean shellExec(String x_name) {
        try {

            String[] p_command = {
                x_name
            };

            Process p_proc = Runtime.getRuntime().exec(p_command);
            int p_status = p_proc.waitFor();

            if (p_status != 0) {
                System.out.println("error = " + p_status);

                if (p_status==2) {
                    //  ペンディング状態は無視
                    return true;
                }
                return false;
            }

        } catch (java.io.IOException e) {
            return false;
        } catch (InterruptedException e) {
            return false;
        }
        return true;
    }
}

■別のシェルを実行したステータス取得
別のシェルを実行した場合のステータスを取得したい場合があると思います。
もっと簡単な取得方法を例に示してみます。
■ステータス取得
./test.sh
if [ $? != 0 ] ; then
  echo "test.shでエラーが発生しました。"
  exit 1
fi

■javaから戻り値を取得する方法
最近は、経費をかけないシステムが多いので、javaとlinuxを連携する場合も多いと思います。
以下にjavaから、日付を取得する例を示します。
■シェル側
JAVA_DATE=$(java jp/co/test/JavaDate)

■java側
public class JavaDate {
    public JavaDate() {
    }

    public static void  main(String[] argv) {
        // 日付文字列を返します
        System.out.println("20070101");
    }
}