bash 中的&符号能否一直保持后台运行的疑问

2015-01-26 16:46:56 +08:00
 yadam

问题是: &字符能否保持ssh的session结束之后 一直 运行?
一直对搜这种特殊字符无能, Google了关键字 ssh Ampersand 换了几个描述也没找到想要的答案.搜到的基本全是怎么样nohup和&结合的描述


软件没有写成守护进程,但是还想后台运行, 一直以来用的是screen, 最近使用 "./app & " 这种方式启动,发现软件会退出, 所以想排除这种使用方式的问题.

4114 次点击
所在节点    问与答
11 条回复
wzxjohn
2015-01-26 16:49:25 +08:00
nohup 一起用确实可以,不过你有 screen 为何不用。。。一直都用 screen 的路过。。。
66450146
2015-01-26 16:51:16 +08:00
还是用 screen / tmux 吧……
kslr
2015-01-26 16:57:54 +08:00
& 大致意思是利用SHELL的技巧,新建不属于当前终端的进程,这样终端关闭的信号就不会影响到。
这里有一篇文章:
http://www.ibm.com/developerworks/cn/linux/l-cn-nohup/
rrfeng
2015-01-26 16:59:09 +08:00
bash 默认设置 shopt huponexit 是 off 的。
所以 cmd & 可以一直后台运行,exit ssh 也没有影响。

但是,强行断开 ssh 连接,也就是非常规的 exit 比如网络断了之类的,还是会终止。

使用 nohup 执行,则异常断开也可以保持后台运行。

还有 setsid 和 disown 方式。
meta
2015-01-26 17:02:40 +08:00
如果你的程序不会向标准输出和错误输出写任何东西就可以一直运行,否则的话因为你已经把这两个输出关闭掉了,一般会出错退出。
你可以在程序内部处理,把这两个输出重定向,或者在shell中重定向。比如 > xxx.log 2>&1。如果用nohup的话,默认会重定向到nohup.out
Tink
2015-01-26 17:08:10 +08:00
nohup command &
rrfeng
2015-01-26 17:22:08 +08:00
对,还有一个就是有些程序会判断 stdout/stderr 是否可用。否则会自行关闭。
方法是加上 &> /tmp/log 或者 /dev/null 重定向掉
whuhacker
2015-01-26 19:10:38 +08:00
pstree 查看一下进程树,就知道 ssh 进程下的子进程,在你断开 ssh 连接后都会被杀掉
而 screen / tmux 会把进程都挪出 ssh 的魔爪……
atupal
2015-01-26 19:23:33 +08:00
我一般都
$ (./xxx.sh 1>stdout.log 2>error.log & )

然后就是在 后台运行且 挂到 init 进程下,

要看输出就
$ tail -f stdout.log

要看 错误就
$ tail -f error.log
ryd994
2015-01-26 20:27:06 +08:00
其实还是screen好用啊
lululau
2015-01-26 20:33:30 +08:00
@meta 👍大多数人知道 SIGHUP 可能会使程序终止,而不知道往一个已经关闭了的文件写入数据也可能会使进程终止。hohup 其实有两个作用,一是将进程的SIGHUP handler 设为 IGNORE,二是重定向标准输出和标准错误。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/165591

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX