Linux 一组命令如何转入后台执行?(仍有疑问)

hellomac · 2013年01月25日 · 最后由 hellomac 回复于 2013年01月26日 · 6086 次阅读

预期的目的是: 下载一个 shell 文件并在后台执行,以避免长时间等待. 我的做法如下: wget -O - http://a.com/b.sh|bash 不过这里并未转入后台执行,我只知道单条命令在命令末端追加 & 符号即可。可看起来这并不适用于 pipe. 请教大家正确的写法是?

nohup wget -O - http://a.com/b.sh|bash 或运行 wget -O - http://a.com/b.sh|bash 后按 ctrl + z 再输入 bg 回车

bg - run jobs in the background

#1 楼 @sevk 感谢回复. nohup wget -O - http://a.com/b.sh|bash 系统提示语法错误 后面的方法我也知道,想在程序中自动处理,而不是手动操作,因此 screen 等方式并不合适. 还有其他好办法吗???

加&到后面不就可以了

匿名 #4 2013年01月25日

screen,新建一个后台的 terminal,执行命令再切换回来

pipe 也可以加 & 啊,自己不试下的吗?

#3 楼 @williamherry #5 楼 @doitian 我已经说了看起来并不适用于 pipe,我尝试了加在后面,但是没效果,不知道你有没有试下. #4 楼 @cdrwin 在 2 楼我有说过,screen 等方式并不合适

#6 楼 @hellomac I think you should be able to attach & to a command with pipe.

#7 楼 @blacktulip 我执行的命令是这样的 wget -O - http://a.com/b.sh | bash - & 运行后并没有获得输入焦点,按任意键才会跳转到输入...

#8 楼 @hellomac 不是没焦点,是输出占用了 STDOUT,都重定向一下

wget -O - -o log http://a.com/b.sh | bash - &> b.log &

也可以用 subshell

( command_a; command_b | command_c ) &

#9 楼 @doitian 感谢指点,最终的方案如下: wget -O - -q http://a.com/b.sh | bash - &> /dev/null & 没有采用 subshell 的方式. btw,哪里有比较合适的资料能补下这方面的知识呢?

一直 screen

可以使用 nohup your command &

#9 楼 @doitian 你好,求教一下。&> b.log 我理解是 stdout 和 stderr 输出到 b.log. bash 后的-是什么含义。

#14 楼 @LinuxGit 我 copy 楼主的,按照惯例,应该是从 STDIN 读取并执行

#15 楼 @doitian 多谢,感觉前面管道传给 bash 了,不加好像也行。

> cat echo.sh 
#!/bin/bash
echo "ruby on rails."
(^_^)~ > cat echo.sh | bash
ruby on rails.
(^_^)~> cat echo.sh | bash -
ruby on rails.

我把这个传到公司根目录下用 wget 试了,不加-也行。

如果只是暂时将进程放到后台,可以用 & 或 bg 等 shell 的作业控制命令即可,如果是一个需要长期在后台 run 的守护进程,建议程序遵循 daemon 编程规则,最要不要用 nohup,用不好会碰到各种问题

我这么说的原因是,当一个进程在后台运行,启动它的会话已经关闭时,那么它的标准 IO 所指向的文件 v 节点已经关闭,当进程试图向标准 IO 写入数据时,它会得到一个 IO 异常,如果程序没有处理该异常,那么进程就会异常终止。nohup 虽然重定向了进程的标准 IO,但是这个是有条件的:只有当标准 IO 指向的是一个 tty 时,它才会这么做,有一个很常见的反例:

for host in ...; do
  ssh -o StrictHostKeyChecking username@$host 'nohup cmd &'
done

通过上述命令批量在远程机器上启动后台程序,此时标准 IO 指向的不是 tty,而是一个 socket,nohup 不会重定向 cmd 的标准 IO,上面的脚本实际上很可能就卡在第一次循环就停住了。

再者有的人其实不理解 shell 是如何解析一个输入行的,当你敲下 nohup cmd1 | cmd2 & 这样的命令的时候,它运行的结果可能和你期望的是不一样的

#7 楼 @blacktulip #15 楼 @doitian #17 楼 @lululau 今天在应用的时候又遇到问题了,还是没理解,烦请详细解答下. 我在昨天的基础上随便增加了语句如下: echo 'http://a.com/b.sh' > url && wget -O - -q http://a.com/b.sh | bash - &> /dev/null & 在只考虑语法的情况下,为什么前半段语句的 STDOUT 已经重定向到文件了,系统仍然处于等待状态呢? 或者说,在哪些情况下,系统会处于等待状态???

需要 登录 后方可回复, 如果你还没有账号请 注册新账号