Linux的nohup命令

如果正在运行一个进程,在终端退出的时候不想该进程结束,那么就可以使用 nohup 命令

命令简介

1
2
3
4
DESCRIPTION
The nohup utility invokes utility with its arguments and at this time sets the signal SIGHUP to be ignored.
If the standard output is a terminal, the standard output is appended to the file nohup.out in the current directory.
If standard error is a terminal, it is directed to the same place as the standard output.
1
$ nohup Command [Arg ...] [&]

该命令可以在你退出账户/关闭终端之后继续运行相应的进程。 nohup 就是不挂起的意思(no hang up)。

nohup 运行由 Command 和相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。要想后台运行 nohup 中的命令,只需要在整个命令的结尾添加 &

如果使用 nohup 命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为 nohup.out 的文件中,除非另外指定了输出文件。

使用举例

1
nohup ./client_darwin_amd64 -c /etc/kcptun/kcptun.json > /dev/null 2>&1 &

上面例子中末尾的 & 表示后台运行该条命令; nohup 表示不挂起该条命令,关闭终端之后该命令依然在运行。

> 表示重定向到哪里,例如: echo "123" > /home/123.txt
/dev/null 表示空设备文件,意思就是所有的输出都不进行保存
1 代表 stdout 标准输出
2 代表 stderr 标准错误
2>&1 表示 2 的输出重定向为 1 ;(这里 2>1 看起来是一个更好的方式把标准错误重定向到标准输出,但是容易把 1 误解为一个文件,因此加上了 & 标明是一个文件描述符而不是一个文件名,因此写成 2>&1
> /dev/null 2>&1 语句含义:
  首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,说白了就是不显示任何信息;
  然后,标准错误输出等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

退出任务

如果运行的任务在当前 shell 终端,可以通过 jobs 命令查询相关信息,并且杀掉进程。

1
2
3
4
5
6
7
8
9
10
11
12
# 查看当前 shell 终端的后台运行任务进程信息
$ jobs
[1]+ Running nohup ./client_darwin_amd64 -c /etc/kcptun/kcptun.json > /dev/null 2>&1 &
# 杀掉任务号
$ kill %1
# 或着找到 pid
$ jobs -l
[1]+ 11076 Running nohup ./client_darwin_amd64 -c /etc/kcptun/kcptun.json > /dev/null 2>&1 &
$ kill 11076
# 或着
$ fg # 置为前端运行
Ctrl + c # 退出

如果非当前 shell 终端,可以通过 ps aux | grep client_darwin_amd64 获取 pid 然后 kill pid

jobs 命令的一些参数:

1
2
3
-l :除了列出job number与指令串之外,同时列出PID的号码;
-r :仅列出正在背景run的工作;
-s :仅列出正在背景当中暂停的工作。
坚持原创技术分享,您的支持将鼓励我继续创作!攒点碎银娶媳妇!