使用 nohup 后台运行命令避免 SSH 断连
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 标准输出 + 标准错误
0
表示 stdin 标准输入,用户键盘输入的内容。1
表示 stdout 标准输出,输出到显示屏的内容。2
表示 stderr 标准错误,报错内容。2>&1
是一个整体,>
左右不能有空格,即将错误内容重定向输入到标准输出中去。2>&1
中的&
是为了区别文件 1 和1
(标准输出),假如为2>1
,那么不就成了将错误内容输出到文件1中。test.py >> out.log
和test.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断开影响的方法