Linux 执行一段 shell 命令加与不加 nohup 到底有什么区别? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
BaseException
V2EX    Linux

Linux 执行一段 shell 命令加与不加 nohup 到底有什么区别?

  •  
  •   BaseException 2021-09-17 23:10:08 +08:00 5099 次点击
    这是一个创建于 1564 天前的主题,其中的信息可能已经有所发展或是发生改变。

    请教 Linux 大佬、运维大佬,标题中的问题。下面我先抛砖引玉。

    nohup 英文全称 no hang up (不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。 nohup 命令,在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。

    以上来自 https://www.runoob.com/linux/linux-comm-nohup.html

    执行一个 java 程序,使用命令 1 或 2

    1. java -jar xxx.jar >> ./xxx.log 2>&1 &
    2. nohup java -jar xxx.jar >> ./xxx.log 2>&1 &

    问题 1:

    我使用命令 1 执行的程序,在退出终端之后,进程依然很好的存活着啊,nohup 的真正作用是什么?

    问题 2:

    >> ./xxx.log 这个 >> 跟文件之间需要空格吗?还是有没有空格都一样,我经过测试似乎是一样达到目的的。我知道 > 是直接覆盖, >> 是追加到文件(如果之前文件存在且有内容)。

    谢谢彦祖们。

    第 1 条附言    2021-09-18 09:15:41 +08:00

    谢谢大家的热心回复

    25 条回复    2021-09-22 13:05:22 +08:00
    jaredyam
        1
    jaredyam  
       2021-09-17 23:18:54 +08:00
    你的问题一的前提,可能只在你的终端 GUI 下成立,比如 XShell 。
    momocraft
        2
    momocraft  
       2021-09-17 23:21:07 +08:00   2
    1 重写信号 handler 使进程收到 HUP 信号时不退出

    比如 busybox 版的 nohup https://elixir.bootlin.com/busybox/latest/source/coreutils/nohup.c
    前面都是重定向到文件, "真正作用" 就是 94 行的 signal 和 exec.

    2 一样. >>和文件名是两个 token , 中间随便多少个空格都一样
    BaseException
        3
    BaseException  
    OP
       2021-09-17 23:21:23 +08:00
    @jaredyam #1 windows terminal 上运行着的 git bash
    westoy
        4
    westoy  
       2021-09-17 23:23:56 +08:00   5
    退出终端后, 你之前那个终端派生的进程都变成了孤儿进程, 会响应系统的 SIGHUP 信号把进程挂掉, nohup 干的就是无视这个信号和重定向输出

    你跑的那个 java 如果自己实现了 daemon 就不受影响了啊
    BaseException
        5
    BaseException  
    OP
       2021-09-17 23:25:09 +08:00
    @momocraft #2 感谢。但我还是没怎么懂问题 1,有最佳实践吗,更加推荐 nohup java -jar xxx.jar >> ./xxx.log 2>&1 & 这种写法么
    BaseException
        6
    BaseException  
    OP
       2021-09-17 23:26:49 +08:00
    @westoy #4 谢谢,醍醐灌顶。我跑的 java 程序引入了 quartz,然后有根据 cron 表达式一直运行着
    ysc3839
        7
    ysc3839  
       2021-09-17 23:30:38 +08:00 via Android   1
    1. 可能这个程序自己已经忽略 SIGHUP 了。
    2. 印象中不用。
    momocraft
        8
    momocraft  
       2021-09-18 01:04:58 +08:00   1
    重要程序建议用更稳定的方式跑, 比如用 daemon 管理. nohup 连自动重启都没有.

    不重要的随便
    ch2
        9
    ch2  
       2021-09-18 01:33:22 +08:00   1
    daemon 进程不需要加 nohup,nohup 是让非 daemon 进程脱离 tty 的一种方法
    msg7086
        10
    msg7086  
       2021-09-18 03:06:23 +08:00 via Android   1
    单次运行用 nohup,长期反复运行用系统服务。
    mrqyoung
        11
    mrqyoung  
       2021-09-18 09:03:18 +08:00 via iPhone   1
    顺便,2>&1 这种可以简写为 &>1 。例如:`java -jar xxx.jar &> xxx.log &` 以及 `java -jar xxx.jar &>> xxx.log & `
    lululau
        12
    lululau  
       2021-09-18 09:36:14 +08:00
    4 楼正解
    salmon5
        13
    salmon5  
       2021-09-18 09:55:50 +08:00
    建议使用 java -jar xxx.jar >> ./xxx.log 2>&1 &
    nohup 不建议用,就当它不存在吧,这个命令有点多余
    salmon5
        14
    salmon5  
       2021-09-18 09:56:41 +08:00   1
    生产中,一般用 supervisor 或者容器
    rrfeng
        15
    rrfeng  
       2021-09-18 10:03:41 +08:00 via Android
    shopt 了解一下
    BaseException
        16
    BaseException  
    OP
       2021-09-18 10:29:34 +08:00
    @ysc3839 #7 dei
    @momocraft #8 嗯嗯 是的 可以考虑 systemd 或者 supervisor 或者 build docker image 然后用容器跑
    @salmon5 #13
    @salmon5 #14 嗯嗯
    @rrfeng #15 好的 谢谢我了解一下
    nbweb
        17
    nbweb  
       2021-09-18 10:41:01 +08:00
    @salmon5 现在不都改成 systemctl 了呢,supervisor 在 systemctl 出来之前一直在用,实在奇怪,干嘛不把 supervisor 弄成默认的管理进程,论资历和历史,supervisor 都很老啊。
    salmon5
        18
    salmon5  
       2021-09-18 14:16:58 +08:00
    @nbweb systemd 偏向于系统组件的,supervisor 偏向于业务,比如一堆 java 程序,如果和 systemd 耦合在一起很不优雅;
    salmon5
        19
    salmon5  
       2021-09-18 14:18:50 +08:00
    systemd 比 supervisor 庞大的多,supervisor 比较轻量
    mutalisk
        20
    mutalisk  
       2021-09-18 14:22:23 +08:00
    ignore SIGHUP singal
    wellsc
        21
    wellsc  
       2021-09-18 14:46:51 +08:00
    @salmon5 systemd 很多东西就是借鉴 supervisor 的,可以理解为 kernal + cgroup 控制的 supervisor 啦
    allAboutDbmss
        22
    allAboutDbmss  
       2021-09-19 15:34:08 +08:00
    可以用 screen 再分离出来
    julyclyde
        23
    julyclyde  
       2021-09-22 12:22:05 +08:00
    @nbweb 就凭 supervisord 本身不是编译的,它就不配当一号
    万一系统里没有 python 那不就完蛋了?
    julyclyde
        24
    julyclyde  
       2021-09-22 12:22:31 +08:00
    @wellsc 不能因为 supervisord“用了正确的方法”就说别的软件学他啊
    这完全两码事
    wellsc
        25
    wellsc  
       2021-09-22 13:05:22 +08:00 via iPhone
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5426 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 57ms UTC 06:38 PVG 14:38 LAX 22:38 JFK 01:38
    Do have faith in what you're doing.
    ubao msn 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