Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 直接运行shell命令和从shell脚本sh文件运行shell命令的区别_Java_Shell_Background Process - Fatal编程技术网

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
)。