小技巧:让linux程序在后台运行

转载自:http://www.cnblogs.com/hnrainll/archive/2011/07/04/2097408.html

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

前置知识:

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:~$
  2. 具有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:~$
  3. 你无法记录程序的debug输出结果。
  4. 只有当虚拟终端是 $ 或者 # 时候,才可以关闭此终端,否则可能导致已经启动的进程被关闭(按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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 实验四主要是通过编写Linux设备驱动程序来学习Linux系统的设备驱动开发,加深对Linux内核机制的理解以及了解驱动程序的核心模块、初始化、卸载等操作。在实验过程中,我们先了解了Linux系统下设备的分类,比如字符设备和块设备,并参照示例程序实现了一个字符设备驱动程序。在编写驱动程序的过程中,我们学习了设备文件的创建、设备初始化函数、文件操作函数、I/O控制函数等相关概念和知识,并通过实践掌握了一些具体技能,如打印调试信息、使用Sysfs文件系统等。 通过本次实验,我们深入了解了Linux设备驱动程序的工作原理和编写方法,能够熟练掌握设备文件的创建、设备初始化函数、文件操作函数、驱动模块的加载和卸载等基本概念及应用方法,从而可以为Linux系统开发相关的设备驱动。同时,我们还了解了Linux内核中常用的调试技巧和工具,这些对我们日后的开发和调试工作都将有很大的帮助。通过本次实验,我们进一步提高了对Linux系统的认识和理解,为日后的系统开发奠定了坚实的基础。 ### 回答2: Linux设备驱动程序开发是基于Linux系统的硬件设备的管理和操作,这个过程需要开发者理解设备特性、熟悉Linux内核的结构。本实验旨在让学生学习Linux设备驱动程序的基础知识和基本操作,了解内核模块的加载和卸载,设备驱动程序的注册和注销等。 本次实验的难点在于学生需要理解设备的工作原理,选取合适的设备进行开发并且需要掌握相关的编程技巧。除此之外,还需要学习工具链使用技巧,包括gcc编译器、makefile生成器、gdb调试器、insmod等命令,此外还需要熟悉Linux内核模块的编写和调试。这些技能都是Linux驱动程序开发必备的技能。 通过本次实验,学生将会了解到Linux驱动程序的编写流程、编程模式、数据结构等基础知识,掌握设备驱动程序的注册和卸载方法,了解内核模块机制,熟悉常见的硬件设备和文件系统接口的使用。这些知识将对于学生今后的Linux系统开发和驱动开发有很大的帮助。 ### 回答3: 本次实验的目标是学习linux设备驱动程序的开发。在实验中,我们首先学习了内核模块的编写和加载,了解了内核模块的结构和用法,并通过编写简单的内核模块来巩固理解。 之后,我们学习了字符设备驱动程序的编写,包括了设备文件的创建和使用以及驱动程序的基本结构和函数。通过实现一个简单的字符设备驱动程序,我们了解了驱动程序与用户空间的交互方式和驱动程序的工作原理。 此外,本次实验还包括了中断处理程序的开发,我们学习了中断的触发和处理方式,并通过在驱动程序中实现中断处理程序来巩固理解。 通过本次实验,我们掌握了linux设备驱动程序的开发方法,更深入地了解了操作系统中内核部分的工作原理,对于深入理解操作系统有着重要的意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值