crtl +z 挂起后 bg 也只是当前会话"后台", 且会自动刷新显示, 会话中断也还是抗投诉服务器退出了
能不能中途转成像 nohup 那种真后台执行的?
1.nohup
2.screen
3.tmux
xxx > /dev/null &
插眼等答案
disown 试试,zsh 和 bash 支持
pm2 了解下
楼主的需求是 运行中=>转后台
tmux 你值得拥有
纯命令行有点难吧,装个 GNOME/KDE 然后把操作习惯改成 VNC 过去打开终端,需要转后台的时候直接最小化 /doge
(xxx 1>/dev/null 2>&1 &)
xxx 1>/dev/null 2>&1 & [Enter]
(1) 运行命令
(2) 按 Ctrl-Z 挂起这个命令
(3) 运行 jobs 命令,查看作业号。例如:
[1]+ Running myscript.sh
(4) 将需要的作业放到后台运行:
bg 1
不过最好还是用 screen 或者 tmux 。
11 楼正解,就是一个 job 么。
为什么不读题的人有这么多
跟你有过同样的需求,然后用 screen 做到了,运行命令前,提前创建 screen 会话
screen
记得 disown 可以,但是 stdout 会丢
你这退出 shell 就没了
拿到进程号,一切都好办,无非就是脱离终端,脱离进程组之类的
ping fooo.bar >> test.log
Ctrl + Z
bg
disown
关闭 ssh 会话,若没有 disown, ping 会被杀掉。若执行了 disown, ssh 断开后,ping 的 ppid 会变成 1 (init)。
再次连上一个新的 ssh 会话,tail -f test.log ,ping 仍然正常运行。
要重新连接,可以用 reptyr,不过我没成功。。。
话说,ssh 登陆上去的第一个命令不应该是 screen 吗 /doge/
disown 是可以
如果有 disown 命令:
bg
disown
某些系统没装 disown 命令,也可以用 kill:
kill -20
kill -18
screen 好用,曾经借用这个东东临时展示过网站,hhhh
话说为什么直接
```[ ~ ] $ xxx &```
这样的命令,会话断开后 xxx 进程会退出?
init 进程创建 bash 进程,bash 进程创建会话进程,会话进程创建 xxx 进程
当会话进程退出后,xxx 进程不应该由 init 进程接管吗,为什么会退出?
稍微拿 WSL1/2 都试了下,似乎如果是 session 的根 shell 退出会导致子进程退出。
但比较诡异的地方是,如果先再调用 shell,在内层 shell 中开启了 python3 -m http.server & ,然后把中间层的 shell 给关闭了,那这个 python 进程是 init 子进程,并且正常工作。但是如果这时候再把外层 shell 退出,这个 python 进程还存在,但会 close 一切入站( curl: (52) Empty reply from server )。怀疑是 stopped,但不清楚怎么确认 stopped
setsid ?
systemd / supervisor
nohup 做了两件事,忽略了 SIGHUP,重定向了 stdio,那退出 shell 的时候手动做这两件事就行了
SIGHUP 的话,bash 的 shopt huponexit 默认是 off 的,确保默认值就行了
stdio 的话,可以用 gdb 修改 /proc/PID/fd/{0,1,2},参考 open(2), close(2), dup(2)
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
```
你这个一退 ssh 就自动杀进程了,必须 bg
应该还有 setppid
最好就是用 screen 解决。其它方法管不了 std 输出
screen 最优解
为什么非要中途转,直接写一个 systemd 脚本,type 使用 simple,哪有这么麻烦
supervisor
tmux
screen 或者 tmux 应该是目前最好的方式了吧
bg 什么的还是 session 的后台, 不是常驻,会随 session 被 quit.
还是要 disown 或 screen 才行,
controlling tty 、process group 、session 这几个的后续处理起来比较麻烦
最好是刚开始就搞定
nohup 其实才不是“真”后台呢
screen
tmux,运行命令,Ctrl + B 按一下 d 就 detach 了。tmux a 恢复
插眼学习下~
disown 吧,楼主这怕是已经运行起来了才想起来转后台,楼上都不看题的吗
我一直这么用的,服务跑的好好的,虽然只是个玩具
tmux xxx& exit
xxx > /dev/null &
不是也可以吗???
这个受 SIGHUP 影响
用上 screen 了,真香,但有个别问题,比如 screen 页面鼠标不能滚动,vim 退出后仍保留了记录,我用的终端是 termius,不知道大家有没有这个问题
screen 滚动要用一点特殊手段(进复制模式),vim 退出没办法。
滚动如果想用的舒服,建议把 screen 替换掉,改用 tmux,然后搭配 iTerm2 的 tmux integration 功能
建议 tmux,因为带 libevent 库可以高并发
请教一下各位,screen 分屏后,怎么保存布局?
google 了一下,看着是有现成方法:
Save the layout of the panes with: Ctrl+a : and then type layout save name-of-your-layout. After reattaching to the screen session the panes will be restored.
https://robertbasic.com/blog/split-screen-panes/ctrl +a 后后面是怎么操作的,看描述是键盘输入,但这输入都跑到 command line 了啊,detach 后再回来也没有保存啊
咱俩的头像,哈哈哈哈
知道了。。。
你这 @ 一圈不如发新主题问
先确认下,你是否注意到 `^A:` 这里有两个按键?一个是 `^A` 一个是 `:`。