有些时候,我们需要在终端启动一个程序,并使之运行——但是如果关闭终端,那么这个程序也就随着关闭了。那么有没有什么方法在关闭终端后,让已经从这个终端启动的程序继续运行呢?

前置知识:

xterm,console,tty,pts,pty的区别

  • shell是直接和内核进行通信的东西
  • xterm是一个软件概念,可以通过这个程序连接到console从而控制主机,可以理解为cli形式的终端模拟器,而gnome-terminal,konsole就是gui形式的终端模拟器
  • console是主机的控制台,是一个物理概念。
  • tty、pty、pts都是终端,是硬件或者设备概念。
  • tty是所有终端设备的总称
  • pty是其中一类,伪终端,或者叫虚拟终端
  • “&” 命令行结尾法:

在Unix/Linux下如果想让程序独立终端运行,一般都是使用 & 在命令结尾来让程序自动运行。(命令后可以不追加空格)

打开gnome-terminal,执行如下命令:

delectate@delectate:~$ totem &
[1] 8510
delectate@delectate:~$ 
有几点需要注意:
  1. 已经启动的程序依然attach于当前pts,只有当前终端模拟器关闭(使用exit命令退出),进程自动被tty继承。
delectate@delectate:~$ ps -e | grep totem
    //程序已被以totem & 形式启动,当前附在pts0上
8819 pts/0    00:00:00 totem
delectate@delectate:~$ ps -e | grep totem
   //pts0的模拟终端被exit命令关闭,totem自动附在tty
8819 ?        00:00:00 totem
delectate@delectate:~$

具有debug输出的进程,需要按enter键进行中断当前debug输出。但是如果程序持续进行printf,你将无法输入任何命令。

delectate@delectate:~$ vlc &
[1] 8850
delectate@delectate:~$ VLC media player 1.0.6 Goldeneye
[0x8b998b0] main libvlc: Running vlc with the default interface. Use 'cvlc' to use vlc without interface. //enter pressed
delectate@delectate:~$                               //show a clean terminal now
** (:8850): CRITICAL **: giop_thread_request_push: assertion `tdata != NULL' failed //仍然在输出数据……//关闭程序
[1]+  Done                    vlc
delectate@delectate:~$

你无法记录程序的debug输出结果。 只有当虚拟终端是 $ 或者 # 时候,才可以关闭此终端,否则可能导致已经启动的进程被关闭(按enter——如果程序持续输出信息而没有出现 $ 或 #)

  • 使用nohup命令:

nohup描述:Run COMMAND, ignoring hangup signals.(忽略任何中断/挂起信号,使命令继续执行)

但是当你尝试使用命令:

1
nohup command

时候却会遇到不大不小的麻烦……

delectate@delectate:~$ nohup vlc
nohup: ignoring input and appending output to `nohup.out'

是的,虽然它自动把debug信息记录到nohup.out文件,但是你却无法使用这个终端进行任何操作。

所以你需要和第一个方法混用,即

nohup command {option} &

混用后,它会自动把你执行的命令输出结果记录到权限为-rw——-,名为nohup.out的文件中。

但是你仍然需要

delectate@delectate:~$ nohup vlc &
[1] 9045
delectate@delectate:~$ nohup: ignoring input and appending output to `nohup.out'  //在这里按一下回车或以ctrl+c以                    //show a clean terminal 
delectate@delectate:~$

与使用 “&” 性质相同,当前启动程序的终端如果没有被关闭,已经启动的程序附在pst上;如果终端被关闭,则自动附在tty。

如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out。默认状态下,nohup默认输出到nohup.out文件,你也可以利用重定向来指定输出文件:

nohup command {option} > myout.file 2>&1 &

只有当虚拟终端是 $ 或者 # 时候,才可以关闭此终端,否则可能导致已经启动的进程被关闭(按enter——如果程序持续输出信息而没有出现 $ 或 #)

  • 其他相关命令:

jobs:查看当前有多少在后台运行的命令
fg:将后台中的命令调至前台继续运行。如果后台中有多个命令,可以用 fg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)
bg:将一个在后台暂停的命令,变成继续执行。如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

  • 杀死进程

杀死已经启动的程序和普通方式一样:

pkill -9 name killall name kill pid

  • 命令应用:

linux服务器挂机下载;启动相关服务;linux服务器启动进程(尤其是ssh登录)

  • 我就曾经用
1
nohup aria2c -i downloadlist -m 0 -j 1 &

从jsharer极享下载了不少动漫。

参考资料

http://topic.csdn.net/u/20100201/17/a34370cc-8a61-4315-a4d0-84242362064d.html
http://www.linuxsir.org/bbs/thread362001.html
http://www.williamlong.info/archives/482.html
http://dev.firnow.com/course/6_system/linux/Linuxjs/2008716/133186.html

转自:https://www.deleak.com/blog/2010/05/19/run-software-on-background/

小技巧:让linux程序在后台运行相关推荐

  1. 让linux程序在后台运行

    最近要用php进程发奖励,因为要精确到秒执行,linux系统的定时用不了,于是写了个死循环,usleep是必须的,否则系统cpu占用很高的系统cpu. 执行的时候碰到一个问题,关闭终端后进程也终止了. ...

  2. shell脚本配置运行python程序,小技巧之 Linux 软连接的使用

    shell脚本配置运行python程序,小技巧之 Linux 软连接的使用 实验室的多位博士会在同一台机器上跑python程序,主流的跑程序的方法有两种 使用sh脚本配置路径和程序 直接激活conda ...

  3. Linux nohup实现后台运行程序及查看(nohup与)

    Linux nohup实现后台运行程序及查看(nohup与&) 更新时间:2019年09月11日 09:28:40 作者:猿的生活 这篇文章主要介绍了Linux nohup实现后台运行程序及查 ...

  4. linux后台运行cat命令,Linux程序前台后台切换

    Linux程序前台后台切换1.在Linux终端运行命令的时候,在命令末尾加上 & 符号,就可以让程序在后台运行Ubuntu$">root@Ubuntu$ ./tcpserv01 ...

  5. 在linux前台和后台运行程序

    为什么要在linux命令前加上 ./ 简述 在chinaunix 论坛里找到的答案 原来Quote: unix或linux中除了path系统变量外的目录下的命令都要加./ 修改用户的 .bash_pr ...

  6. 【破事氵】在Linux环境中让程序在后台运行

    前言 首先,相信大家都或多或少了解过linux和云服务器.linux作为一个开源的操作系统内核,在开发者人群和服务器领域中有着很高的使用率.而现在在以阿里云为代表的云服务器商中,可以以很低的价格买入入 ...

  7. linux java后台运行_Java程序在Linux中实现后台运行

    1.运行脚本 脚本如下,这个脚本存在一点问题,Log4j稍微有点问题,但是对运行及日志记录没有影响,日志是通过将所有控制台数据全部写入文件的形式记录的. #!/bin/sh #author:wangc ...

  8. Linux如何让程序在后台运行

    如果要运行程序,在命令提示行下输入程序名后回车,程序被执行,然后等待程序运行完成,在程序运行的过程中,也可以用Ctrl+c中止它. 在实际开发中,我们需要让程序在后台运行,没有界面,没有用户输入数据. ...

  9. Linux——让程序在后台运行(四种方法+使用推荐)

    目录 一.第一种方法(加"&"符号) 二.第二种方法(nohup命令)  三.第三种方法(screen命令)   四.第四种方法(systemctl命令)   五.总结 六 ...

最新文章

  1. 使用py2exe打包python脚本为exe可执行程序
  2. Process Monitor中文手册
  3. android 中的常用组件
  4. 高德软件测试工资,【高德工资】软件测试工程师待遇-看准网
  5. Hexo瞎折腾系列(5) - 使用hexo-neat插件压缩页面静态资源
  6. mysql 复制用户_MySQL修改复制用户及密码
  7. oracle ora-22288,向oracle的blob字段导入文件
  8. 物联网(IoT)会是广告欺诈的一道后门
  9. 三维旋转矩阵_线性代数的本质(4)--矩阵乘法与复合变换
  10. 报 刊 集 锦(转载)
  11. AndroidN DisplayManagerService源码简析,亮屏流程分析
  12. 方差np.var()
  13. php毕设周记_php实习日记
  14. 烟雨黑帽seo超级模板站群-可一键清除内页URL转换成单页-百度搜狗超级模板站群-多城市网站站群
  15. android 取消蓝牙配对框 实现自动配对,Android 取消蓝牙配对框实现自动配对功能...
  16. 大白话解读什么是七层网络协议,TCP/IP五层模型通信知识(一)
  17. cmd结束指定端口号的进程
  18. 关于互联网公司的加班制度,我想说点心里话
  19. 阿里云搭建个人博客(workpress)
  20. Postman(七): postman应用实战

热门文章

  1. OSPF简单多区域及末梢区域配置
  2. java j2se1.5_用J2SE1.5建立多任务的Java应用程序...
  3. mysql5.6 线程池_[MySQL5.6] Percona Server 5.6.14的线程池浅析
  4. python生成伪随机数的扩展库_python模块介绍-random:生成伪随机数
  5. c#如何wmf图片转换成png图片_每日一学:如何将png图片转换为jpg图片
  6. visual foxpro 程序员指南_如何平衡工作和生活的关系?程序员归来依旧是少年的好方法...
  7. oracle帮助系统,开启Oracle的帮助系统
  8. 三年级学生计算机学情分析,三年级上学期学生学情分析
  9. 华中科技大学应用高等工程数学_专业解析【第152期】| 机械电子工程课程设置及研究方向...
  10. java重命名sheet失败_java jxl excel 数据导出 重新命名无效的工作表名称 | 学步园...