TYPECHO WIKI
每一个作品都值得被记录

Xshell断开连接后仍保持服务器程序执行的方法(nohup,tmux)

Typecho维基君开发日志 • 189次浏览 • 发布 2024-03-08 • 更新 2024-03-08

最近在写一些爬虫脚本,脚本是通过cli命令行界面运行的,我们知道xshell连接到服务器后,如果我们直接在xshell窗口里运行程序,那么一旦因为网络故障之类的原因导致xhsell断开连接的话,这个程序就会中止运行,这对于那些需要运行很久才能得出结果的程序来说简直是灭顶之灾(比如要训练好多天的深度学习模型),所以我们要借助tmux、nohup这类工具来使得我们的程序可以在后台运行,即使xshell断开连接也不会影响到程序的运行,重新连接之后再打开这个工具就可以看到程序的运行情况了。

tmux比nohup方便,建议使用tmux。

一、tmux

先安装tmux:

# Ubuntu 或 Debian
$ sudo apt-get install tmux

# CentOS 或 Fedora
$ sudo yum install tmux

# Mac
$ brew install tmux

然后就可以新开一个会话了:

tmux new -s session_name 

这个会话相当于一个后台进程,你可以在这个会话里运行程序,这个会话会一直存在,直到你用命令把他删掉。只要会话还存在,里面的程序就会一直运行。所以这个会话里的程序不会因为你关闭xshell就自动停止。

在会话里启动进程后,回到原本界面的方法:

先按下ctrl+b,然后再单独按d

回到原本界面之后,会话里的程序仍然在运行,此时再重新回到会话里查看程序运行情况的命令:

tmux a -t session_name 

也可以同时新建多个会话,如命名为s1,s2,s3等等。在会话间切换的命令(不一定需要在单独一个xshell窗口里切换会话,还不如多开几个xhsell窗口来各自打开一个会话,这样更方便):

先按ctrl+b ,再按s,然后就可以在会话间选择其中一个,按enter进入。

有时候会话中只能显示一页的程序运行信息,这个时候可以这样查看会话中历史信息记录

先按ctrl+b,然后按Page Up ,Page Down

如果程序已经都运行完了,就可以删除会话了,删除会话的命令:

 tmux kill -session -t session_name

有同学问,这样用tmux创建多个会话来运行多个程序的话,跟创建多个xshell窗口来运行多个程序有什么不同呢?不同之处就在于,前者即使电脑死机导致xshell断开连接,之前运行的程序还会在服务器中继续运行;而后者如果xshelll断开连接,所有窗口的程序都会自动结束运行,特别是深度学习模型需要训练很久,中途结束就会导致前功尽弃。

二、nohup

(参考https://blog.csdn.net/limiaoiao/article/details/81948401实现Xshell断开连接情况下Linux命令继续执行

1、将原命令语句改为:nohup 命令语句 &

2、回车执行,再回车,窗口中会显示一个进程号

3、如果中途想关闭,可执行:kill -9 进程号。如果想查看命令执行情况,可执行:cat nohup.out

效果如下:

img

程序的对应进程已经在后台运行,且运行输出都记录在文件nohup.out中,我们随时可以用语句cat nohup.out查看进程运行情况:

img

关闭xshell,再打开,用语句watch -n 1 nvidia-smi 查看显卡使用情况:

img

可见我们的进程31764仍在运行。

注意nohup.out文件保存在项目文件目录下,因此重新连接后要重新回到项目目录下才能用cat nohup.out 查看程序运行情况。

————————————

一开始我是用nohup的,但nohup还是太麻烦,后来我又改用tmux了:

广告声明:文内含有的对外跳转链接(包括不限于超链接、二维码、口令等形式),用于传递更多信息,节省甄选时间,结果仅供参考,Typecho.Wiki所有文章均包含本声明。
厂商投放

【腾讯云】🎉五一云上盛惠!云服务器99元/月续费同价!

腾讯云五一劳动节海量产品 · 轻松上云!云服务器首年1.8折起,买1年送3个月!超值优惠,性能稳定,让您的云端之旅更加畅享。快来腾讯云选购吧!

广告
添加新评论 »