请教 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
java -jar xxx.jar >> ./xxx.log 2>&1 &nohup java -jar xxx.jar >> ./xxx.log 2>&1 &我使用命令 1 执行的程序,在退出终端之后,进程依然很好的存活着啊,nohup 的真正作用是什么?
>> ./xxx.log 这个 >> 跟文件之间需要空格吗?还是有没有空格都一样,我经过测试似乎是一样达到目的的。我知道 > 是直接覆盖, >> 是追加到文件(如果之前文件存在且有内容)。
谢谢彦祖们。
谢谢大家的热心回复
|  |      1jaredyam      2021-09-17 23:18:54 +08:00 你的问题一的前提,可能只在你的终端 GUI 下成立,比如 XShell 。 | 
|  |      2momocraft      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 , 中间随便多少个空格都一样 | 
|  |      3BaseException OP @jaredyam #1 windows terminal 上运行着的 git bash | 
|  |      4westoy      2021-09-17 23:23:56 +08:00  5 退出终端后, 你之前那个终端派生的进程都变成了孤儿进程, 会响应系统的 SIGHUP 信号把进程挂掉,  nohup 干的就是无视这个信号和重定向输出 你跑的那个 java 如果自己实现了 daemon 就不受影响了啊 | 
|  |      5BaseException OP @momocraft #2 感谢。但我还是没怎么懂问题 1,有最佳实践吗,更加推荐 nohup java -jar xxx.jar >> ./xxx.log 2>&1 & 这种写法么 | 
|  |      6BaseException OP @westoy #4 谢谢,醍醐灌顶。我跑的 java 程序引入了 quartz,然后有根据 cron 表达式一直运行着 | 
|  |      7ysc3839      2021-09-17 23:30:38 +08:00 via Android  1 1. 可能这个程序自己已经忽略 SIGHUP 了。 2. 印象中不用。 | 
|  |      8momocraft      2021-09-18 01:04:58 +08:00  1 重要程序建议用更稳定的方式跑, 比如用 daemon 管理. nohup 连自动重启都没有. 不重要的随便 | 
|  |      9ch2      2021-09-18 01:33:22 +08:00  1 daemon 进程不需要加 nohup,nohup 是让非 daemon 进程脱离 tty 的一种方法 | 
|  |      10msg7086      2021-09-18 03:06:23 +08:00 via Android  1 单次运行用 nohup,长期反复运行用系统服务。 | 
|      11mrqyoung      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 & ` | 
|  |      12lululau      2021-09-18 09:36:14 +08:00 4 楼正解 | 
|      13salmon5      2021-09-18 09:55:50 +08:00 建议使用 java -jar xxx.jar >> ./xxx.log 2>&1 & nohup 不建议用,就当它不存在吧,这个命令有点多余 | 
|      14salmon5      2021-09-18 09:56:41 +08:00  1 生产中,一般用 supervisor 或者容器 | 
|  |      15rrfeng      2021-09-18 10:03:41 +08:00 via Android shopt 了解一下 | 
|  |      16BaseException OP | 
|  |      17nbweb      2021-09-18 10:41:01 +08:00 @salmon5 现在不都改成 systemctl 了呢,supervisor 在 systemctl 出来之前一直在用,实在奇怪,干嘛不把 supervisor 弄成默认的管理进程,论资历和历史,supervisor 都很老啊。 | 
|      18salmon5      2021-09-18 14:16:58 +08:00 @nbweb systemd 偏向于系统组件的,supervisor 偏向于业务,比如一堆 java 程序,如果和 systemd 耦合在一起很不优雅; | 
|      19salmon5      2021-09-18 14:18:50 +08:00 systemd 比 supervisor 庞大的多,supervisor 比较轻量 | 
|      20mutalisk      2021-09-18 14:22:23 +08:00 ignore SIGHUP singal | 
|  |      21wellsc      2021-09-18 14:46:51 +08:00 @salmon5 systemd 很多东西就是借鉴 supervisor 的,可以理解为 kernal + cgroup 控制的 supervisor 啦 | 
|      22allAboutDbmss      2021-09-19 15:34:08 +08:00 可以用 screen 再分离出来 |