Linux 前台运行中的脚本,有没有办法转到后台(会话断开也不影响那种) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
css3
V2EX    程序员

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

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

    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  
    PRO
       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     Solana     908 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 21:57 PVG 05:57 LAX 14:57 JFK 17:57
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86