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

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

  •  
  •   css3 · 218 天前 · 3419 次点击
    这是一个创建于 218 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

    不是也可以吗???
    julyclyde
        47
    julyclyde   214 天前
    @Xhack 这个受 SIGHUP 影响
    css3
        48
    css3   209 天前
    @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   209 天前
    @css3 screen 滚动要用一点特殊手段(进复制模式),vim 退出没办法。
    julyclyde
        50
    julyclyde   208 天前
    @css3 滚动如果想用的舒服,建议把 screen 替换掉,改用 tmux,然后搭配 iTerm2 的 tmux integration 功能
    jyf007
        51
    jyf007   200 天前 via Android
    @css3 建议 tmux,因为带 libevent 库可以高并发
    css3
        52
    css3   199 天前
    @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   199 天前
    @z775781 #15 咱俩的头像,哈哈哈哈
    css3
        54
    css3   199 天前
    @css3 知道了。。。
    no1xsyzy
        55
    no1xsyzy   199 天前
    @css3 你这 @ 一圈不如发新主题问
    先确认下,你是否注意到 `^A:` 这里有两个按键?一个是 `^A` 一个是 `:`。
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1039 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 21:19 · PVG 05:19 · LAX 14:19 · JFK 17:19
    ♥ Do have faith in what you're doing.