2

私はjava program標準入力から読んでいる

BufferedInputStream bis = new BufferedInputStream(System.in);
byte[] b = new byte[1];
int cmd = bis.read(b);
System.out.println("Read command: " + new String(b));

そして、shell scriptこのプログラムを開始/停止するには

'start')
if [ -p myfifo ]; then
    rm myfifo
    rm myfifo-cat-pid
fi
mkfifo myfifo
cat > myfifo &
echo $! > myfifo-cat-pid
java -jar lib/myJar.jar >/dev/null 2>&1 0<myfifo &
echo `date +%D-%T` $! >> process.pid
echo "Started process: "$!
;;

'stop')
echo 0 > myfifo
echo "Stopped process: "
rm myfifo
;;

start でコマンドを 1 つずつ実行すると、プログラムは fifo でエコーするまで待機します。しかし、.sh ファイルから実行すると、すぐに stdin から読み込まれます。コマンドプロンプトでコマンドを直接実行する場合と、.shファイルを作成して実行する場合の違いがわかりません

4

1 に答える 1

1

違いはJava側にありませんが、代わりに、スクリプトを起動するときにシェルがジョブコントロールを異なる方法で処理するという事実にあります。差出人man bash

JOB CONTROL
   Job  control  refers  to  the ability to selectively stop (suspend) the
   execution of processes and continue (resume) their execution at a later
   point.   A  user  typically  employs  this  facility via an interactive
   interface supplied jointly by the operating  system  kernel's  terminal
   driver and bash.

ここで説明するように、デフォルトでは、スクリプトではジョブ制御が無効になっています。

cat > myfifo &インタラクティブシェルで実行されると、「停止」モードのままになり、再びフォアグラウンドに配置されるのを待ちます(を使用fg)。代わりに、スクリプトで起動すると、ジョブ制御が無効になるため、cat(切り離された)ターミナルから読み取ろうとするとすぐに存在し、パイプを閉じます(Javaプロセスは読み取りますEOF)。

シェルスクリプトの先頭で使用する場合set -m(したがって、強制的にジョブ制御を有効にする)、一貫した動作が見られるはずです。

set [+abefhkmnptuvxBCEHPT] [+o option-name] [arg ...]
  -m      Monitor mode.  Job control is enabled.  This option is on by
          default for interactive shells on systems  that  support  it
          (see JOB CONTROL above).  Background processes run in a sep‐
          arate process group and a line containing their exit  status
          is printed upon their completion.
于 2012-07-30T07:33:51.023 に答える