【问题标题】:difference between running shell command directly and from shell script sh file直接运行 shell 命令和从 shell 脚本 sh 文件运行的区别
【发布时间】:2012-07-27 20:02:23
【问题描述】:

我有一个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 中一一运行命令时,程序会一直等到我在 fifo 上回显。但是当我从 .sh 文件运行它时,它会立即从标准输入中读取。不明白如果直接在命令提示符下运行命令与我创建一个 .sh 文件然后运行它有什么区别

【问题讨论】:

  • 如果您运行 .sh 文件,从 stdin 读取的内容是什么?屏幕上的输出是什么?

标签: java shell background-process


【解决方案1】:

区别不在于Java 方面,而是在于您的shell 在启动脚本时对作业控制的处理方式不同。来自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.

正如here 解释的那样,默认情况下,脚本中的作业控制是禁用的。

cat &gt; myfifo &amp; 在交互式shell 中执行时,它仍处于“已停止”模式,等待再次置于前台(使用fg)。相反,当在脚本中启动时,作业控制被禁用,因此,一旦cat 尝试从(分离的)终端读取,它就存在,关闭管道(并且您的Java 进程读取EOF)。

如果您在 shell 脚本的顶部使用 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.

【讨论】:

  • 在哪里使用 set -m 我的意思是在标题中??
  • 在使用&amp; 启动任何命令之前;也就是说,可能最好在脚本的开头。
  • 我已将第一个命令添加为 set -m... 这没什么区别 :(
  • 您使用的是哪个外壳?如果不是 Bash,那么可能你的 shell 不支持set -m