V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
css3
V2EX  ›  程序员

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

  •  
  •   css3 · 2021-03-22 20:23:48 +08:00 · 4761 次点击
    这是一个创建于 1122 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    55 条回复    2021-04-10 18:08:55 +08:00
    dilu
        1
    dilu  
       2021-03-22 20:25:03 +08:00   ❤️ 3
    1.nohup
    2.screen
    3.tmux
    xing2387
        2
    xing2387  
       2021-03-22 20:28:51 +08:00
    xxx > /dev/null &
    sadfQED2
        3
    sadfQED2  
       2021-03-22 20:33:02 +08:00 via Android
    插眼等答案
    Osk
        4
    Osk  
       2021-03-22 20:34:16 +08:00 via Android
    disown 试试,zsh 和 bash 支持
    PUBG98k
        5
    PUBG98k  
       2021-03-22 20:37:48 +08:00
    pm2 了解下
    wusheng0
        6
    wusheng0  
       2021-03-22 20:39:11 +08:00 via Android
    楼主的需求是 运行中=>转后台
    yitingbai
        7
    yitingbai  
       2021-03-22 20:48:26 +08:00
    tmux 你值得拥有
    flineqaq
        8
    flineqaq  
       2021-03-22 20:53:23 +08:00
    纯命令行有点难吧,装个 GNOME/KDE 然后把操作习惯改成 VNC 过去打开终端,需要转后台的时候直接最小化 /doge
    csdreamdong
        9
    csdreamdong  
       2021-03-22 21:13:49 +08:00
    (xxx 1>/dev/null 2>&1 &)
    jasonkayzk
        10
    jasonkayzk  
       2021-03-22 21:28:50 +08:00
    xxx 1>/dev/null 2>&1 & [Enter]
    longbow0
        11
    longbow0  
       2021-03-22 21:29:50 +08:00   ❤️ 20
    (1) 运行命令
    (2) 按 Ctrl-Z 挂起这个命令
    (3) 运行 jobs 命令,查看作业号。例如:
    [1]+ Running myscript.sh
    (4) 将需要的作业放到后台运行:
    bg 1
    longbow0
        12
    longbow0  
       2021-03-22 21:30:31 +08:00
    @longbow0
    不过最好还是用 screen 或者 tmux 。
    saytesnake
        13
    saytesnake  
       2021-03-22 21:40:40 +08:00
    11 楼正解,就是一个 job 么。
    CEBBCAT
        14
    CEBBCAT  
       2021-03-22 21:53:20 +08:00 via Android   ❤️ 7
    为什么不读题的人有这么多
    z775781
        15
    z775781  
       2021-03-22 22:07:43 +08:00
    跟你有过同样的需求,然后用 screen 做到了,运行命令前,提前创建 screen 会话
    skadi
        16
    skadi  
       2021-03-22 22:09:31 +08:00
    screen
    lance6716
        17
    lance6716  
       2021-03-22 22:25:56 +08:00 via Android
    记得 disown 可以,但是 stdout 会丢
    carlclone
        18
    carlclone  
       2021-03-22 22:32:43 +08:00   ❤️ 1
    @longbow0 你这退出 shell 就没了
    Kasumi20
        19
    Kasumi20  
       2021-03-22 22:37:33 +08:00
    拿到进程号,一切都好办,无非就是脱离终端,脱离进程组之类的
    Osk
        20
    Osk  
       2021-03-22 22:50:43 +08:00 via Android   ❤️ 2
    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/
    Tink
        21
    Tink  
       2021-03-23 00:00:52 +08:00 via Android
    disown 是可以
    weyou
        22
    weyou  
       2021-03-23 00:04:22 +08:00 via Android
    如果有 disown 命令:
    <Ctrl+Z>
    bg
    disown

    某些系统没装 disown 命令,也可以用 kill:
    kill -20 <PID>
    kill -18 <PID>
    psyer
        23
    psyer  
       2021-03-23 00:08:55 +08:00 via Android
    screen 好用,曾经借用这个东东临时展示过网站,hhhh
    pkookp8
        24
    pkookp8  
       2021-03-23 00:23:59 +08:00
    话说为什么直接
    ```[ ~ ] $ xxx &```
    这样的命令,会话断开后 xxx 进程会退出?
    init 进程创建 bash 进程,bash 进程创建会话进程,会话进程创建 xxx 进程
    当会话进程退出后,xxx 进程不应该由 init 进程接管吗,为什么会退出?
    no1xsyzy
        25
    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
        26
    dzdh  
       2021-03-23 01:12:04 +08:00
    setsid ?
    systemd / supervisor
    24owls
        27
    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
        28
    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
        29
    mingl0280  
       2021-03-23 04:34:11 +08:00 via Android
    @xing2387 你这个一退 ssh 就自动杀进程了,必须 bg
    mingl0280
        30
    mingl0280  
       2021-03-23 04:36:28 +08:00 via Android
    @24owls 应该还有 setppid
    augustheart
        31
    augustheart  
       2021-03-23 07:55:06 +08:00 via Android
    最好就是用 screen 解决。其它方法管不了 std 输出
    Usaki
        32
    Usaki  
       2021-03-23 08:26:29 +08:00 via Android
    screen 最优解
    gugugagadun
        33
    gugugagadun  
       2021-03-23 08:41:25 +08:00
    为什么非要中途转,直接写一个 systemd 脚本,type 使用 simple,哪有这么麻烦
    Quarter
        34
    Quarter  
       2021-03-23 09:05:37 +08:00 via iPhone
    supervisor
    meshell
        35
    meshell  
       2021-03-23 09:42:21 +08:00
    tmux
    lanlanye
        36
    lanlanye  
       2021-03-23 10:15:16 +08:00
    screen 或者 tmux 应该是目前最好的方式了吧
    wmhx
        37
    wmhx  
       2021-03-23 10:25:34 +08:00
    bg 什么的还是 session 的后台, 不是常驻,会随 session 被 quit.
    还是要 disown 或 screen 才行,
    julyclyde
        38
    julyclyde  
       2021-03-23 10:59:41 +08:00
    controlling tty 、process group 、session 这几个的后续处理起来比较麻烦
    最好是刚开始就搞定
    julyclyde
        39
    julyclyde  
       2021-03-23 11:00:55 +08:00
    nohup 其实才不是“真”后台呢
    gqkkk
        40
    gqkkk  
       2021-03-23 11:03:07 +08:00
    screen
    fuis
        41
    fuis  
       2021-03-23 11:04:30 +08:00
    tmux,运行命令,Ctrl + B 按一下 d 就 detach 了。tmux a 恢复
    hayhong123
        42
    hayhong123  
       2021-03-23 11:16:06 +08:00
    插眼学习下~
    iseki
        43
    iseki  
       2021-03-23 11:31:27 +08:00 via Android
    disown 吧,楼主这怕是已经运行起来了才想起来转后台,楼上都不看题的吗
    xing2387
        44
    xing2387  
       2021-03-23 15:13:10 +08:00
    @mingl0280 我一直这么用的,服务跑的好好的,虽然只是个玩具
    jyf007
        45
    jyf007  
       2021-03-23 19:15:25 +08:00
    tmux xxx& exit
    Xhack
        46
    Xhack  
       2021-03-24 09:55:47 +08:00
    xxx > /dev/null &

    不是也可以吗???
    julyclyde
        47
    julyclyde  
       2021-03-26 11:54:26 +08:00
    @Xhack 这个受 SIGHUP 影响
    css3
        48
    css3  
    OP
       2021-03-31 16:18:10 +08:00
    @css3 @dilu @xing2387 @sadfQED2 @Osk @PUBG98k @wusheng0 @yitingbai @flineqaq @csdreamdong @jasonkayzk @longbow0 @saytesnake @CEBBCAT @z775781 @skadi @lance6716 @carlclone @Kasumi20 @Tink @weyou @psyer @pkookp8 @no1xsyzy @dzdh @24owls @mingl0280 @augustheart @Usaki @gugugagadun @Quarter @meshell @lanlanye @wmhx @julyclyde @gqkkk @fuis @hayhong123 @iseki @jyf007 @Xhack

    用上 screen 了,真香,但有个别问题,比如 screen 页面鼠标不能滚动,vim 退出后仍保留了记录,我用的终端是 termius,不知道大家有没有这个问题
    mingl0280
        49
    mingl0280  
       2021-03-31 16:56:09 +08:00
    @css3 screen 滚动要用一点特殊手段(进复制模式),vim 退出没办法。
    julyclyde
        50
    julyclyde  
       2021-04-01 11:25:33 +08:00
    @css3 滚动如果想用的舒服,建议把 screen 替换掉,改用 tmux,然后搭配 iTerm2 的 tmux integration 功能
    jyf007
        51
    jyf007  
       2021-04-09 11:43:18 +08:00 via Android
    @css3 建议 tmux,因为带 libevent 库可以高并发
    css3
        52
    css3  
    OP
       2021-04-10 13:37:17 +08:00
    @css3 @dilu @xing2387 @sadfQED2 @Osk @PUBG98k @wusheng0 @yitingbai @flineqaq @csdreamdong @jasonkayzk @longbow0 @saytesnake @CEBBCAT @z775781 @skadi @lance6716 @carlclone @Kasumi20 @Tink @weyou @psyer @pkookp8 @no1xsyzy @dzdh @24owls @mingl0280 @augustheart @Usaki @gugugagadun @Quarter @meshell @lanlanye @wmhx @julyclyde @gqkkk @fuis @hayhong123 @iseki @jyf007 @Xhack

    请教一下各位,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/#:~:text=To%20start%20a%20new%20command,the%20panes%20will%20be%20restored.

    ctrl +a 后后面是怎么操作的,看描述是键盘输入,但这输入都跑到 command line 了啊,detach 后再回来也没有保存啊
    psyer
        53
    psyer  
       2021-04-10 14:40:40 +08:00
    @z775781 #15 咱俩的头像,哈哈哈哈
    css3
        54
    css3  
    OP
       2021-04-10 14:45:09 +08:00
    @css3 知道了。。。
    no1xsyzy
        55
    no1xsyzy  
       2021-04-10 18:08:55 +08:00
    @css3 你这 @ 一圈不如发新主题问
    先确认下,你是否注意到 `^A:` 这里有两个按键?一个是 `^A` 一个是 `:`。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5091 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 05:41 · PVG 13:41 · LAX 22:41 · JFK 01:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.