gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 11:42:27 26 4
gpt4 key购买 nike

我有一个 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
;;

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

最佳答案

区别不在于 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 > myfifo & 在交互式 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.

关于java - 直接运行 shell 命令和从 shell 脚本 sh 文件运行的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11716654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com