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