Linux 前台运行中的脚本,有没有办法转到后台(会话断开也不影响那种)

2021-03-22 20:23:48 +08:00
 css3

crtl +z 挂起后 bg 也只是当前会话"后台", 且会自动刷新显示, 会话中断也还是退出了

能不能中途转成像 nohup 那种真后台执行的?

5026 次点击
所在节点    程序员
55 条回复
Tink
2021-03-23 00:00:52 +08:00
disown 是可以
weyou
2021-03-23 00:04:22 +08:00
如果有 disown 命令:
<Ctrl+Z>
bg
disown

某些系统没装 disown 命令,也可以用 kill:
kill -20 <PID>
kill -18 <PID>
psyer
2021-03-23 00:08:55 +08:00
screen 好用,曾经借用这个东东临时展示过网站,hhhh
pkookp8
2021-03-23 00:23:59 +08:00
话说为什么直接
```[ ~ ] $ xxx &```
这样的命令,会话断开后 xxx 进程会退出?
init 进程创建 bash 进程,bash 进程创建会话进程,会话进程创建 xxx 进程
当会话进程退出后,xxx 进程不应该由 init 进程接管吗,为什么会退出?
no1xsyzy
2021-03-23 00:57:01 +08:00
@pkookp8 稍微拿 WSL1/2 都试了下,似乎如果是 session 的根 shell 退出会导致子进程退出。

但比较诡异的地方是,如果先再调用 shell,在内层 shell 中开启了 python3 -m http.server & ,然后把中间层的 shell 给关闭了,那这个 python 进程是 init 子进程,并且正常工作。但是如果这时候再把外层 shell 退出,这个 python 进程还存在,但会 close 一切入站( curl: (52) Empty reply from server )。怀疑是 stopped,但不清楚怎么确认 stopped
dzdh
2021-03-23 01:12:04 +08:00
setsid ?
systemd / supervisor
24owls
2021-03-23 02:28:54 +08:00
nohup 做了两件事,忽略了 SIGHUP,重定向了 stdio,那退出 shell 的时候手动做这两件事就行了

SIGHUP 的话,bash 的 shopt huponexit 默认是 off 的,确保默认值就行了

stdio 的话,可以用 gdb 修改 /proc/PID/fd/{0,1,2},参考 open(2), close(2), dup(2)
24owls
2021-03-23 02:33:55 +08:00
gdb 修改 cat stdin/stdout/stderr 的例子

```
$ cat > /tmp/test-in
1
22
333
$ cat
^Z
[1]+ Stopped cat
$ jobs -l
[1]+ 6138 Stopped cat
$ gdb -q
(gdb) attach 6138
Attaching to process 6138
[ noise ]
(gdb) call (int) close (0)
$1 = 0
(gdb) call (int) open ("/tmp/test-in", 0200)
$2 = 0
(gdb) call (int) close (1)
$3 = 0
(gdb) call (int) open ("/tmp/test-out-err", 0501, 0644)
$4 = 1
(gdb) call (int) close (2)
$5 = 0
(gdb) call (int) dup (1)
$6 = 2
(gdb) detach
Detaching from program: /usr/bin/cat, process 6138
[Inferior 1 (process 6138) detached]
(gdb) quit
$ bg
[1]+ cat &
$ jobs -l
[1]+ 6138 Done cat
$ cat /tmp/test-out
1
22
333
```
mingl0280
2021-03-23 04:34:11 +08:00
@xing2387 你这个一退 ssh 就自动杀进程了,必须 bg
mingl0280
2021-03-23 04:36:28 +08:00
@24owls 应该还有 setppid
augustheart
2021-03-23 07:55:06 +08:00
最好就是用 screen 解决。其它方法管不了 std 输出
Usaki
2021-03-23 08:26:29 +08:00
screen 最优解
gugugagadun
2021-03-23 08:41:25 +08:00
为什么非要中途转,直接写一个 systemd 脚本,type 使用 simple,哪有这么麻烦
Quarter
2021-03-23 09:05:37 +08:00
supervisor
meshell
2021-03-23 09:42:21 +08:00
tmux
lanlanye
2021-03-23 10:15:16 +08:00
screen 或者 tmux 应该是目前最好的方式了吧
wmhx
2021-03-23 10:25:34 +08:00
bg 什么的还是 session 的后台, 不是常驻,会随 session 被 quit.
还是要 disown 或 screen 才行,
julyclyde
2021-03-23 10:59:41 +08:00
controlling tty 、process group 、session 这几个的后续处理起来比较麻烦
最好是刚开始就搞定
julyclyde
2021-03-23 11:00:55 +08:00
nohup 其实才不是“真”后台呢
gqkkk
2021-03-23 11:03:07 +08:00
screen

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

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

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

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

© 2021 V2EX