使用 nohup 后台运行命令避免 SSH 断连

1 minute read

Published:

在使用服务器的过程中,通常会跑一些比较长时间的代码,这个时候希望能将程序运行在服务器后台,防止客户端断开 SSH 时结束程序。

程序终止原因:SSH 下直接运行的命令会被当作 SSH 的子进程,SSH 作为父进程断掉后,子进程也跟着挂了。

使用 nohup

nohup 的用途就是让提交的命令忽略 hangup 信号,是 no hang up 的缩写,指不间断,不挂断。运行一个进程的时候,不想让其在你退出账号时关闭,即可用 nohup

当前终端

使用 nohup 命令:下面的 test.py 将会后台运行,不受 SSH 断开影响,& 为后台运行。

nohup python test.py &

查看 test.py 的输出信息:nohup 会将输出默认记录到当前目录的 nohup.out

# 监控日志打印
tail -f nohup.out
# 查看最后1000行日志文本
tail -1000 nohup.out

查看当前有哪些 nohup 任务在跑。

jobs -l

关闭 nohup 任务:上一步的 jobs 会输出每条任务的 pid,直接 kill 就好了。

# 杀死进程
kill pid
# 强制杀死进程
kill -9 pid

新开终端

进程查看

jobs 命令只看当前终端生效的,关闭终端后,在另一个终端 jobs 已经无法看到后台跑的程序了,此时利用 ps(进程查看命令)

ps -aux | grep test.py
# a:显示所有程序 
# u:以用户为主的格式来显示 
# x:显示所有程序,不以终端机来区分

最后一行总是会 grep 自己,用 grep -v 参数可以将 grep 命令排除掉。

ps -aux | grep test.py | grep -v grep

awk 可以提取进程 pid

ps -aux | grep test.py | grep -v grep | awk '{print $2}'

nohup 输出详解

# 简单用法
nohup python test.py &
# 输出定向(标准输出 + 标准错误)
nohup python test.py > out.log 2>&1 &
# 输出销毁(标准输出 + 标准错误)
nohup python test.py > /dev/null 2>&1 &

输出定向

若希望定向输出到某个某个文件夹:

nohup python test.py > out.log &
nohup python test.py >> out.log &

将脚本输出的内容重定向输入 out.log 中( >> 意为追加,如果用 > 会让文件的内容清空)

若希望输出销毁:

nohup python test.py > /dev/null 2>&1 &

将错误和标准全部丢入 /dev/null 中,全部销毁。

若希望只销毁标准输出,保留标准错误

nohup python test.py > /dev/null 2>out.log &

2>&1 标准输出 + 标准错误

  1. 0 表示 stdin 标准输入,用户键盘输入的内容。 1 表示 stdout 标准输出,输出到显示屏的内容。 2 表示 stderr 标准错误,报错内容。
  2. 2>&1 是一个整体,> 左右不能有空格,即将错误内容重定向输入到标准输出中去。
  3. 2>&1 中的 & 是为了区别文件 1 和 1(标准输出),假如为 2>1,那么不就成了将错误内容输出到文件1中。
  4. test.py >> out.logtest.py 1>>out.log相同,只是 1 (标准输入)被省略了。

清空 nohup.out

两个可以不用停止进程就可以清空 nohup.out 的命令:

cp /dev/null nohup.out
cat /dev/null > nohup.out

其他说明

还可以 使用 screen 实现后台运行服务器 的功能,还有一些其他方法可参考 Linux下让进程在后台可靠运行的几种方法(nohup/&)和前后台运行程序切换,目前更喜欢使用 tmux 来进行后台进程管理,功能更加强大,可参考Tmux 配置:打造最适合自己的终端复用工具

参考资料及致谢

Raspberry - 让命令后台运行避免受到SSH断开影响的方法

nohup和&后台运行,进程查看及终止

Python后台运行—nohup及2>&1详解

Linux下如何不停止服务,清空nohup.out文件

Linux下让进程在后台可靠运行的几种方法(nohup/&)和前后台运行程序切换

Linux 守护进程的启动方法

Tmux 配置:打造最适合自己的终端复用工具