Java 直接运行shell命令和从shell脚本sh文件运行shell命令的区别
我有一个Java 直接运行shell命令和从shell脚本sh文件运行shell命令的区别,java,shell,background-process,Java,Shell,Background Process,我有一个java程序,我正在其中阅读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脚本来启动和停止这个程序 'start') if [ -p myfifo ]; then rm my
java程序
,我正在其中阅读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脚本
来启动和停止这个程序
'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
;;
“开始”)
如果[-p myfifo];然后
rm myfifo
rm myfifo cat pid
fi
mkfifomyfifo
猫>我的FIFO&
echo$!>myfifo猫pid
java-jarlib/myJar.jar>/dev/null 2>&1 0>process.pid
echo“已启动进程:”$!
;;
"停")
echo 0>myfifo
echo“已停止进程:”
rm myfifo
;;
当我在“逐个启动”中运行命令时,程序将等待,直到我在fifo上回显。但当我从.sh文件运行它时,它会立即从stdin中读取。不明白如果直接在命令提示符下运行命令与生成一个.sh文件并运行它有什么区别,那么区别不在Java方面,而是在启动脚本时shell对作业控件的处理方式不同。从
manbash
:
作业控制
作业控制是指有选择地停止(挂起)作业的能力
执行流程,并在以后继续(恢复)其执行
指向用户通常通过交互式应用程序使用此功能
由操作系统内核的终端共同提供的接口
驱动程序和bash。
如上所述,默认情况下,在脚本中禁用作业控制
在交互式shell中执行cat>myfifo&
时,它将保持“停止”模式,等待再次放在前台(使用fg
)。相反,在脚本中启动时,作业控制被禁用,因此只要cat
尝试从(分离的)终端读取,它就存在,关闭管道(并且您的Java
进程读取EOF
)
如果在shell脚本的顶部使用set-m
(因此可以强制启用作业控制),您应该会看到一致的行为
set[+abefhkmnptuvxBCEHPT][+o选项名][arg…]
-m监控模式。作业控制已启用。此选项由打开
支持交互式Shell的系统上的交互式Shell的默认设置
(参见上面的作业控制)。后台进程在sep中运行
arate进程组和包含其退出状态的行
完成后打印。
如果运行.sh文件,从stdin中读取什么?屏幕上的输出是什么?在使用和启动任何命令之前,在标题中使用set-m的位置;也就是说,在脚本的开头可能是最好的。我添加了第一个命令set-m。。。这没有什么区别:(您使用的是哪个shell?如果不是Bash,那么您的shell可能不支持set-m
)。