Linux小技巧:如何后台运行命令
Linux小技巧:如何后台运行命令

估计有很多做生信的小伙伴用的服务器都不带有类似slurm的job handler,所有命令都必须在前端跑。其实真的需要一直盯着前端吗?遇到断网、没电、或者不小心关掉终端,几个小时直接白跑 应该怎么办呢?今天来分享一些在服务器上"让程序自己跑"的小技巧,让你不再需要担心一夜回到解放前~
最简单的方案:nohup
如果你只是想让程序在后台运行,最基础的方法是使用nohup命令:
nohup your_command &
比如:
bashCopynohup cellranger count --id=sample1 ... > run.log 2>&1 &
这样程序就会在后台运行,并且把输出写入run.log文件。即使你关掉终端或者断网 ,程序也会继续运行。末尾的&表示在后台运行,2>&1表示把错误信息也写入日志。
但是用nohup有个问题:你没法随时查看程序运行的状态。如果想看看进度,只能去翻日志文件...这就很不优雅了!
进阶方案:screen
screen 是一个非常好用的终端复用工具。它就像给你的命令创建了一个"虚拟终端 ",你可以随时进入查看,也可以随时离开。
没有sudo权限?没关系!如果没有sudo权限(比如共用的服务器),可以使用conda安装:
conda -c conda-forge install screen
或者在自己的目录下编译安装:
# 下载screen源码
wget https://ftp.gnu.org/gnu/screen/screen-4.9.0.tar.gz
# 解压
tar -xzf screen-4.9.0.tar.gz
cd screen-4.9.0
# 配置并安装到自己的目录
./configure --prefix=$HOME/.local
make && make install
# 把screen加入PATH
echo 'export PATH=$HOME/.local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
screen的基本用法
1. 创建新会话:
screen -S my_run # my_run是会话名称,可以随便取
2. 在会话中运行你的命令:
# 仅示例
cellranger count --id=sample1 ...
3. 暂时离开会话: 按Ctrl+A,然后按D (保持Ctrl+A按下)
4. 回到会话:
screen -r my_run
5. 查看所有会话:
screen -ls
6. 关闭会话: 进入到需要关闭的会话中,输入exit
是不是很简单?你可以创建多个screen会话,比如一个跑cellranger,一个跑R分析,想看哪个就进哪个~退出终端了也没关系,重新登录上服务器时回到会话就可以了。
进阶方案:tmux
如果你觉得screen不够优雅,还可以试试tmux 。tmux比screen更现代,界面也更好看。同样的,没有sudo权限也可以自己装:
conda安装:
conda -c conda-forge install tmux
自己编译安装:
# 下载源码
wget https://github.com/tmux/tmux/releases/download/3.3a/tmux-3.3a.tar.gz
tar -xf tmux-3.3a.tar.gz
cd tmux-3.3a
# 配置安装
./configure --prefix=$HOME/.local
make && make install
# 加入PATH
echo 'export PATH=$HOME/.local/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
tmux的基本用法:
1. 新建会话:
tmux new -s my_run2. 暂时离开:
Ctrl + B,然后按D3. 回到会话:
tmux attach -t my_run4. 查看所有会话:
tmux ls
小贴士
如果使用共享服务器的话,注意不要同时开太多窗口,占用过多资源哦!还有,无论用哪种方式,建议都把输出写入日志文件 ,方便查看:
your_command > run.log 2>&1
如果你用tmux/screen,可以开多个窗口,一边跑程序一边看日志:
# 在tmux中按Ctrl+B再按C创建新窗口
# 在新窗口中
tail -f run.log # 实时查看日志
好啦,有了这些工具,以后就再也不用担心断网、断电导致任务中断啦!你们最常用哪种方式在服务器上跑程序呢?欢迎在评论区分享你的经验~