一、写在前面
经常有粉丝表示,自己在linux终端运行任务时不能退出,一旦掉线任务就会终止运行。这是因为远程访问Linux时,在终端中直接运行的任务通常与当前的终端会话绑定,这意味着任务的运行依赖于这个终端会话的持续存。即远程访问在线,终端任务运行;远程访问断开,终端任务中止。具体的原理是:
当你在终端中启动一个任务时,它成为该终端会话的一个子进程。这个子进程与你的登录会话直接关联,因此,如果你的终端会话断开(如SSH连接中断、网络连接丢失或关闭终端窗口等),所有关联的子进程通常也会被终止。当终端会话结束时,操作系统会向所有在这个会话中启动的后台进程发送一个称为SIGHUP(挂断信号)的信号。默认情况下,接收到SIGHUP信号的进程将会退出。这就是为什么掉线或终端会话结束时,直接在终端中运行的任务会停止的原因。
为了避免"程序跑的时候人还得在电脑前面随时盯着,万一网络掉线程序终止还得重新提交"的情况发生。我们可以选择用"bg,fg,jobs,nohup,&"等方式将Linux命令挂载到后台,后台运行任务的好处如下:
1、多任务处理:当你将一个任务放在后台运行时,你可以继续在同一个终端使用其他命令,进行其他任务。这样你不必等待一个长时间执行的命令完成即可执行其他操作。
2、节省资源:后台运行的任务通常不需要交互,这意味着它们不占用终端资源。这可以更高效地利用系统资源,尤其是在处理多个任务时。
3、改善工作流:你可以启动多个后台进程,每个进程执行不同的任务,从而在单个终端中高效地处理多个任务。这对于需要执行多个独立任务的服务器和多任务环境特别有用。
4、无干扰运行:后台进程不会干扰前台的用户界面和操作(例如输出提示信息、询问信息等),使得用户可以在前台运行的程序中保持良好的交互体验,而不被其他进程的运行状态干扰。
5、日志记录和监控:后台任务可以将输出重定向到文件,便于后期检查输出和错误。这对于需要监控的长时间运行的服务或脚本特别有用。
如果你对下面的教程比较迷茫,那么你可以先行学习Linux教程:
如果你的计算机不足以支持下面流程的计算,可按需选用适合自己的计算资源:
共享(经济实惠):有root权限的共享服务器,报我名字立减200¥
独享(省电省心):生信分析不求人
实体(稳定高效):为实验室准备一份生物信息学不动产
访问链接:https://biomamba.xiyoucloud.net/
二、nohup命令
nohup 命令(No Hang UP)是一个在 Unix 和 Linux 系统中非常有用的命令,用于在用户登出或会话断开时继续运行命令。当与 & 符号(表示将命令置于后台运行)结合使用时,nohup 命令可以让进程无视挂断信号,即使终端被关闭,程序仍然运行。
基本用法:
nohup 你要执行命令 &
在使用nohup时,还可以进行输出重定向(Linux| 17.输出重定向),例如下面这个命令,就可以把标准输出(1)和标准错误(2)输出到output.log日志文件中去。这样你就可以用文本编辑器(Linux| 25. 文件编辑器 vim)在你有空的时候查看任务的运行情况啦。
nohup 你要执行命令> output.log 2>&1 &
Rstudio不想再吐槽了,如果你想运行一个资源占用较大、计算时间较长的R命令,那么我建议你先把R代码写到一个脚本里,然后用以下方式提交:
nohup /usr/bin/R --no-save < 你的R脚本 > 日志文件地址.log 2>&1 &
如果你和我一样会出现等候焦虑的症状,可以在R脚本的默认加上一段发送邮件的代码,来提醒你去收结果:
三、暂停并重新挂载命令
另外有一种比较特殊的情况,你可能在前端运行一个时间较长的大任务,运行了一段时间后你发现无法保证在命令运行结束前远程连接一直在线(比如晚上校园网会断开的同学们),这时你可以用Ctrl+Z的形式暂停任务,在用bg命令把任务交给后台继续执行。具体操作步骤如下:
1、你可能有一个命令已经在前端运行:
你的命令代码
2、按下Ctrl+Z暂停这个任务:
3、使用bg命令可以把刚才暂停的命令交由后台执行
如果不加任务编号,则默认执行最近一次暂停的命令
4、当你有多个任务被暂停时,可以通过jobs命令来查看所有被暂停的任务,再用bg命令加上任务编号来指定任务恢复在后台运行:
查看暂停任务:
重新挂载任务1:
bg 1
最后让这个任务与你的终端解偶联,这样退出当前终端或终端掉线时这个命令仍然能在后台继续执行。
disown # 防止终端关闭时任务被终止