用于执行生成的启动后台进程的Bash脚本

时间:2016-02-01 19:30:38

标签: bash shell

我正在编写一个shell脚本,同时在一个目录中启动几个jar。我遇到的问题是将这些问题作为后台进程启动。

我所能做的就是让第一个进程启动,然后无限期挂起。奇怪的是,生成和执行的命令在显式执行时表现如预期(复制/粘贴到shell中或在文件中创建并执行它们)。这不是什么疯事(我想?)。目的是获取本地目录中的jar列表并将其作为后台进程启动。

以下是我遇到问题的相关内容:

jars=(`ls ${appDirectory}/*jar`)
for j in ${jars[@]}; do `java -jar ${j} 2>&1 > /dev/null &`; done;

关于问题可能是什么的任何想法?我用管子贴在什么东西上?我需要执行一些黑魔法来从shell中启动后台进程吗?任何帮助深表感谢。谢谢!

2 个答案:

答案 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在后台。