直接运行shell命令和从shell脚本sh文件之间的区别

时间:2012-07-30 06:55:48

标签: java shell background-process

我有一个java program我正在从stdin中读取

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
;;

当我逐个启动命令时,程序会一直等到我在fifo上回显。但是当我从.sh文件运行它时,它立即从stdin读取。不明白如果直接在命令提示符下运行命令和我是否生成.sh文件并运行它之间有什么区别

1 个答案:

答案 0 :(得分: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所述,默认情况下,脚本中禁用了作业控制。

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

如果您在shell脚本的顶部使用EOF(因此强制执行作业控制),您应该会看到一致的行为。

set -m