一、nohup
1.1 简介
nohup
是一个命令行实用程序,用于在用户注销后继续运行命令。它的名字来源于 “no hang up”(不要挂断),意味着即使用户挂断(注销)了,命令也会继续执行。
1.2 用法
以下是 nohup
的一些关键特性和用法:
后台运行命令:
nohup
允许你运行一个命令,即使在终端关闭或用户注销后,该命令也会继续在后台运行。
忽略挂起信号:
- 默认情况下,当终端会话结束时,所有的进程都会收到
SIGHUP
(挂起信号),这会导致大多数程序终止。nohup
命令会忽略这个信号,使得进程可以继续运行。
- 默认情况下,当终端会话结束时,所有的进程都会收到
输出重定向:
- 如果你不指定输出文件,
nohup
会将输出重定向到名为nohup.out
的文件中。如果nohup.out
文件已存在,输出会被追加到文件末尾。
- 如果你不指定输出文件,
使用示例:
运行一个命令并忽略挂起信号:
nohup some-command &
将输出重定向到特定文件:
nohup some-command > output.log 2>&1 &
这里 >
将标准输出重定向到 output.log
,2>&1
将标准错误也重定向到同一个文件。
退出代码:
nohup
命令本身会返回0
,表示成功执行。它不会返回后台运行命令的退出代码。
查看后台进程:
- 你可以使用
ps
命令查看后台运行的nohup
进程,或者使用jobs
查看当前会话的后台作业。
- 你可以使用
结束后台进程:
- 如果需要结束
nohup
启动的后台进程,可以使用kill
命令加上进程的 PID(进程编号)。
- 如果需要结束
1.3 使用示例
在一个需要长时间(24小时以上)运行python脚本的场景中,一开始通过MobaXTerm连接远程主机获取ssh的shell,然后直接在终端运行 /路径/python xxxx.py
,第二天查看日志的时候,脚本莫名其妙终止了。怀疑可能是堡垒机回收或者shell断开连接导致的。
为了测试是否是上述原因,并解决因为shell断连导致脚本运行结束的问题,使用nohup后台运行python任务进程。
nohup xxxxx/python xxxxx.py > myTest.log 2>&1 &
- 命令详解:
- **
nohup
**:这是命令的开始,表示忽略挂起信号,即使用户注销或终端关闭,命令也会继续运行。- **
xxxxx/python
**:这部分应该是要执行的 Python 解释器的路径。请确保替换xxxxx
为实际的路径,例如/usr/bin/python
。- **
xxxxx.py
**:这是要运行的 Python 脚本的路径。同样,请确保替换xxxxx
为实际的脚本路径,例如/home/user/myscript.py
。- **
>
**:这是一个输出重定向操作符,它会将标准输出(stdout)重定向到后面指定的文件。- **
myTest.log
**:这是希望将标准输出重定向到的文件名。如果该文件不存在,nohup
会创建它;如果文件已存在,输出会覆盖到myTest.log文件。- **
2>&1
**:这是一个错误输出重定向操作符,它将标准错误(stderr)重定向到标准输出(stdout)。这意味着错误信息也会被写入到myTest.log
文件中。- **
&
**:这是一个后台运行操作符,它将命令放在后台执行,允许您继续在同一终端进行其他操作。综上所述,这个命令的意思是:使用
nohup
运行指定路径的 Python 解释器来执行指定路径的 Python 脚本,并将标准输出和标准错误都重定向到myTest.log
文件中,同时让这个命令在后台运行。
- 2>&1详解:
2>&1
是一个在 Unix 和类 Unix 系统中常用的 shell 操作符,用于将标准错误(stderr,文件描述符为 2)重定向到标准输出(stdout,文件描述符为 1)的位置。下面是对2>&1
的详细解释:
- **
2
**:这个数字代表标准错误输出(stderr)的文件描述符。在 Unix 系统中,每个打开的文件都有一个与之关联的文件描述符,而标准错误输出默认的文件描述符是 2。- **
>
**:这是一个重定向操作符,用于将紧随其后的文件描述符的输出重定向到指定的位置。&1
:1
是标准输出(stdout)的文件描述符。&1
表示将前面的文件描述符(这里是标准错误 stderr)重定向到标准输出的位置。「这里的&没有固定的意思放在>后面的&,表示重定向的目标不是一个文件,而是一个文件描述符综合起来,
2>&1
的作用是将标准错误输出重定向到标准输出的位置。这意味着,原本应该输出到 stderr 的内容(通常是错误信息)现在会和 stdout 的内容一起输出。
nohup
是一个非常有用的工具,特别是在需要长时间运行的命令或者需要在服务器上执行长时间任务时。通过使用 nohup
,你可以确保即使在远程会话断开后,任务仍然可以继续执行。