专栏首页生物信息学如何使程序在Linux后台运行

如何使程序在Linux后台运行

经常在Linux上面运行程序都有这样的体验:

  1. 某个程序运行的时候,会产生大量的log(提示)信息,但实际上我们只想让它跑一下而已,log暂时不需要或者后面才有需要。
  2. 同时run多个相同或者不同程序的时候,占了好多的命令行界面,作为一个强迫症患者,就想要一个清爽的界面!
  3. 电脑不小心休眠了或者关机了,又或者wifi断开了,没网了,导致运行老久的程序直接中断了,又得重头开始!

◆ ◆ ◆ ◆ ◆

先来解决第一个问题,如何放到后台

很简单,就是在所有命令后面都加个空格和 “&” 符号就可以了:

./test &

这样一来,test程序就在后台运行了。但是,这样处理还不够,因为这样做虽然程序是在后台运行了,但log依然不停的输出到当前终端。因此,要让终端彻底的清静,还应将log重定向到指定的文件:

./test > out.txt 2>&1 &

2>&1是指将标准错误重定向到标准输出,于是标准错误和标准输出都重定向到指定的out.txt文件中,从此终端彻底清静了。

如果程序已经在运行了,其实也是有办法加入后台的,只需使用快捷键 ctrl-z 就能立马放到后台中了,不过这种方法其实是暂停了程序的运行,所以想要让程序继续运行还得输入 “fg” 命令让程序返回前台来。

那现在程序在后台运行了,我们怎么找到它呢?很简单,有两种方法:

1. jobs命令

jobs命令可以查看当前有多少在后台运行。

jobs -l

此命令可显示所有任务的PID,jobs的状态可以是running, stopped, Terminated。但是如果任务被终止了(kill),shell 从当前的shell环境已知的列表中删除任务的进程标识。

2. ps命令

ps -ef | grep test

用grep查询ps -ef的结果,就可以显示所有正在运行的任务中含有test关键词的程序具体信息了。

◆ ◆ ◆ ◆ ◆

nohup命令来避免程序中断

在命令的末尾加个&符号后,程序可以在后台运行,但是一旦当前终端关闭(即退出当前帐户),该程序就会停止运行。那假如说我们想要退出当前终端,但又想让程序在后台运行,该如何处理呢?

实际上,这种需求在十分很常见,比如想远程到服务器编译软件或者需要长时间的运行一个程序,但网络不稳定,一旦掉线就中止了,很浪费时间。

在这种情况下,我们就可以使用nohup命令。nohup就是不挂起的意思( no hang up)。该命令的一般形式为:

nohup ./test &

如果仅仅如此使用nohup命令的话,程序的输出会默认重定向到一个nohup.out文件下。如果我们想要输出到指定文件,可另外指定输出文件:

nohup ./test > out.txt 2>&1 &

这样一来,多管齐下,既使用了nohup命令,也使用了&符号,同时把标准输出/错误重定向到指定文件中。

PS:

还有一种也很常见的避免中断的方法,就是使用screen命令,它能够在一个真实终端下运行伪终端,我们可以在这个伪终端里面为所欲为,再也不用担心网络中断会对我们的进程造成影响,也不用给每个命令前都加上“nohup”。

但是screen的缺点是开很多screen进程的时候,会生成多个伪终端,比较占用系统资源,另外批量生成screen的同时并在screen里面运行程序有些困难,不如nohup + &批量处理的方便。

本文分享自微信公众号 - 生物信息学(swxxx1),作者:阿凡亮

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-11

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 只用一行来颠覆你处理文件的方式

    引言:生物信息学文件多样,通常我们会遇到各种将不同格式进行转换或者把文件修改成我们想要的那种格式的需求,不懂生信的小伙伴们会请教会生信的小伙伴,其实会生信的同学...

    阿凡亮
  • 一天一点命令行之scp

    相信连过远程服务器的小伙伴对 ssh 命令一定不陌生,经常会用ssh命令从一个服务器登录到另一个服务器( $ ssh username@xx.xx.xx.xx ...

    阿凡亮
  • 一键批量计算kaks

    ParaAT是中科院基因组所的章张课题组开发的工具,它整合了计算ka/ks所需的一整套分析,包括:

    阿凡亮
  • Neural Fictitious Self Play——从博弈论到深度强化学习

    用户1107453
  • 【C语言笔记】C语言编译的过程

    如果你使用的是集成开发环境,那么你点击编译按钮就可生成可执行文件,然后点击运行即可运行。那么,你知道从源代码到可执行文件经历了哪些过程吗。仅仅是编译?

    正念君
  • 前端面试题汇总

    (1) vue.js 兄弟组件通信 生命周期 vue router vuex 原理 (2) angular (3) react ...

    城市中的游牧民族
  • Istio的流量管理(实操一)(istio 系列三)

    使用官方的Bookinfo应用进行测试。涵盖官方文档Traffic Management章节中的请求路由,故障注入,流量迁移,TCP流量迁移,请求超时,熔断处理...

    charlieroro
  • 使用MongoDB进行分片

    本文档回答了有关分片的常见问题。或者可以参考手册的分片章节,其提供了 分片的概述,包括如下细节:

    MongoDB中文社区
  • Android面向切面AOP架构设计后续补充

    假设 test 类里有使用到 @aop 的切点注解,那么我们在混淆文件中就应该 -keep 这个 test 类

    萬物並作吾以觀復
  • PrivaZer 2020 捐助者版 3.0

    PrivaZer 2020 捐赠者版是一个非常有用的应用程序,将使您能够清除你系统上的任何应用程序的互联网浏览痕迹。此实用程序可以进行深度扫描,安全地...

    萌海无涯

扫码关注云+社区

领取腾讯云代金券