首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash:在后台启动多个链式命令

问bash:在后台启动多个链式命令
EN

Stack Overflow用户
提问于 2008-10-02 07:50:25
回答 15查看 91.5K关注 0票数 47

我正在尝试使用bash在后台并行运行一些命令。这是我想要做的:

代码语言:javascript
复制
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,给它一组命令,并告诉它转到后台?

EN

回答 15

Stack Overflow用户

回答已采纳

发布于 2008-10-02 08:24:17

我还没有测试过这个,但是

代码语言:javascript
复制
print `(touch .file1.lock; cp bigfile1 /destination; rm .file1.lock;) &`;

圆括号的意思是在子subshell中执行,但这不会有什么坏处。

票数 32
EN

Stack Overflow用户

发布于 2008-10-02 08:42:24

谢谢休,就这么办了:

代码语言:javascript
复制
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:~$ 

其他的想法不起作用,因为它们在后台启动每个命令,而不是命令序列(这在我的例子中很重要!)。

再次感谢您!

票数 21
EN

Stack Overflow用户

发布于 2013-09-26 21:15:46

另一种方法是使用以下语法:

代码语言:javascript
复制
{ command1; command2; command3; } &
wait

请注意,&位于命令组的末尾,而不是每个命令之后。最后一个命令后的分号是必需的,第一个括号之后和最后一个括号之前的空格也是必需的。末尾的wait确保父进程不会在衍生的子进程(命令组)结束之前被终止。

您还可以做一些奇特的事情,比如重定向stderr和stdout

代码语言:javascript
复制
{ command1; command2; command3; } 2>&2 1>&1 &

您的示例将如下所示:

代码语言:javascript
复制
forloop() {
    { touch .file1.lock; cp bigfile1 /destination; rm .file1.lock; } &
}
# ... do some other concurrent stuff
wait # wait for childs to end
票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/161252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档