我正在编写一个shell脚本,同时在一个目录中启动几个jar。我遇到的问题是将这些问题作为后台进程启动。
我所能做的就是让第一个进程启动,然后无限期挂起。奇怪的是,生成和执行的命令在显式执行时表现如预期(复制/粘贴到shell中或在文件中创建并执行它们)。这不是什么疯事(我想?)。目的是获取本地目录中的jar列表并将其作为后台进程启动。
以下是我遇到问题的相关内容:
jars=(`ls ${appDirectory}/*jar`)
for j in ${jars[@]}; do `java -jar ${j} 2>&1 > /dev/null &`; done;
关于问题可能是什么的任何想法?我用管子贴在什么东西上?我需要执行一些黑魔法来从shell中启动后台进程吗?任何帮助深表感谢。谢谢!
答案 0 :(得分:2)
我猜你的意思是
for j in ${appDirectory}/*.jar;
do
java -jar ${j} 2>&1 > /dev/null &
done
考虑到你没有文件名中的空格。
答案 1 :(得分:0)
dtmilano已经解决了这个问题;我想解释问题发生的原因。根本原因是命令的这一部分的反引号:
`java -jar ${j} 2>&1 > /dev/null &`
shell中的反引号是捕获所附命令的输出,并将其用作新命令的一部分(或者在这种情况下是整个命令)。因此,它会在后台触发java -jar ${j} 2>&1 > /dev/null
,但会尝试捕获其输出。与您的想法相反,2>&1 > /dev/null
不会将stderr和stdout都发送到/ dev / null;它将命令的stdout重定向到/ dev / null,但命令的stderr会被发送到外层的stdout。因此,反引用表达最终捕获了java的stderr。这意味着它必须等到java实例退出以确保它拥有所有内容....即使java在后台。