我正在尝试使用bash在后台并行运行一些命令。这是我想要做的:
forloop {
//this part is actually written in perl
//call command sequence
print `touch .file1.lock; cp bigfile1 /destination; rm .file1.lock;`;
}反引号之间的部分()产生一个新的shell并连续执行命令。问题是,只有在执行完最后一个命令后,才会返回对原始程序的控制。我希望在后台执行整个语句(我不期望任何输出/返回值),并且希望循环继续运行。
调用程序(具有循环的那个程序)直到所有生成的shell都完成后才会结束。
我可以使用perl中的线程来产生不同的线程,这些线程调用不同的shell,但这似乎有点过分了……
我是否可以启动一个shell,给它一组命令,并告诉它转到后台?
发布于 2008-10-02 08:24:17
我还没有测试过这个,但是
print `(touch .file1.lock; cp bigfile1 /destination; rm .file1.lock;) &`;圆括号的意思是在子subshell中执行,但这不会有什么坏处。
发布于 2008-10-02 08:42:24
谢谢休,就这么办了:
adrianp@frost:~$ (echo "started"; sleep 15; echo "stopped")
started
stopped
adrianp@frost:~$ (echo "started"; sleep 15; echo "stopped") &
started
[1] 7101
adrianp@frost:~$ stopped
[1]+ Done ( echo "started"; sleep 15; echo "stopped" )
adrianp@frost:~$ 其他的想法不起作用,因为它们在后台启动每个命令,而不是命令序列(这在我的例子中很重要!)。
再次感谢您!
发布于 2013-09-26 21:15:46
另一种方法是使用以下语法:
{ command1; command2; command3; } &
wait请注意,&位于命令组的末尾,而不是每个命令之后。最后一个命令后的分号是必需的,第一个括号之后和最后一个括号之前的空格也是必需的。末尾的wait确保父进程不会在衍生的子进程(命令组)结束之前被终止。
您还可以做一些奇特的事情,比如重定向stderr和stdout
{ command1; command2; command3; } 2>&2 1>&1 &您的示例将如下所示:
forloop() {
{ touch .file1.lock; cp bigfile1 /destination; rm .file1.lock; } &
}
# ... do some other concurrent stuff
wait # wait for childs to endhttps://stackoverflow.com/questions/161252
复制相似问题