`
dacoolbaby
  • 浏览: 1262383 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

将你的Linux命令放在后台执行

阅读更多

文章refer to: http://www.cnblogs.com/lwm-1988/archive/2011/08/20/2147299.html 

 

   有两种方式:

   1. command & : 后台运行,你关掉终端会停止运行
   2. nohup command & : 后台运行,你关掉终端也会继续运行

command 表示你执行的shell命令,或者脚本。

 

一、 简介 
       Linux/Unix 区别于微软平台最大的优点就是真正的多用户,多任务。因此在任务管理上也有别具特色的管理思想。
       我们知道,在 Windows 上面,我们要么让一个程序作为服务在后台一直运行,要么停止这个服务。而不能让程序在前台后台之间切换。而 Linux 提供了 fg 和bg 命令,让你轻松调度正在运行的任务。假设你发现前台运行的一个程序需要很长的时间,但是需要干其他的事情,你就可以用

Ctrl-Z ,挂起这个程序,然后可以看到系统提示:
[1]+ Stopped /root/bin/rsync.sh

 

然后我们可以把程序调度到后台执行:(bg 后面的数字为作业号)
#bg 1
[1]+ /root/bin/rsync.sh &


用 jobs 命令查看正在运行的任务:
#jobs
[1]+ Running /root/bin/rsync.sh &


如果想把它调回到前台运行,可以用
#fg 1
/root/bin/rsync.sh


这样,你在控制台上就只能等待这个任务完成了。

 

这里使用:

&                         将指令丢到后台中去执行
[ctrl]+z                將前台任务丟到后台中暂停
jobs                    查看后台的工作状态
fg %jobnumber  将后台的任务拿到前台来处理
bg %jobnumber 将任务放到后台中去处理
kill                       管理后台的任务

 

二、在Linux中,当在前台运行某个作业时,终端被该作业占据;而在后台运行作业时,它不会占据终端。可以使用&命令把作业放到后台执行。实际上,这样是将命令放入到一个作业队列中了:

$ ./test.sh &
[1] 17208

$ jobs -l
[1]+ 17208 Running                 ./test.sh &
    在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。不过,作业在后台运行一样会将结果输出到屏幕上,干扰你的工作。如果放在后台运行的作业会产生大量的输出,最好使用下面的方法把它的输出重定向到某个文件中:
command >out.file 2>&1 &


在上面的例子中,2>&1表示所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中。 当你成功地提交进程以后,就会显示出一个进程号,可以用它来监控该进程,或杀死它。
例:查找名为“httpd.conf”的文件,并把所有标准输出和错误输出重定向到find.dt的文件中:
# find /etc/httpd/ -name "httpd.conf" -print >find.dt 2>&1 &


[2] 7832
成功提交该命令之后,系统给出了它的进程号7832。 对于已经在前台执行的命令,也可以重新放到后台执行,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行,例如对正在前台执行的tesh.sh使用ctrl+z挂起它:
$ ./test.sh
[1]+ Stopped                 ./test.sh

$ bg %1
[1]+ ./test.sh &

$ jobs -l
[1]+ 22794 Running                 ./test.sh &

但是如上方到后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程退出,则会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。如果我们要在退出shell的时候继续运行进程,则需要使用nohup忽略hangup信号,或者setsid将将父进程设为init进程(进程号为1)

$ echo $$
21734

$ nohup ./test.sh &
[1] 29016

$ ps -ef | grep test
515      29710 21734 0 11:47 pts/12   00:00:00 /bin/sh ./test.sh
515      29713 21734 0 11:47 pts/12   00:00:00 grep test
$ setsid ./test.sh &
[1] 409

$ ps -ef | grep test
515        410     1 0 11:49 ?        00:00:00 /bin/sh ./test.sh
515        413 21734 0 11:49 pts/12   00:00:00 grep test


上面的试验演示了使用nohup/setsid加上&使进程在后台运行,同时不受当前shell退出的影响。那么对于已经在后台运行的进程,该怎么办呢?可以使用disown命令:

$ ./test.sh &
[1] 2539

$ jobs -l
[1]+ 2539 Running                 ./test.sh &

$ disown -h %1

$ ps -ef | grep test
515        410     1 0 11:49 ?        00:00:00 /bin/sh ./test.sh
515       2542 21734 0 11:52 pts/12   00:00:00 grep test


另外还有一种方法,即使将进程在一个subshell中执行,其实这和setsid异曲同工。方法很简单,将命令用括号() 括起来即可:

$ (./test.sh &)

$ ps -ef | grep test
515        410     1 0 11:49 ?        00:00:00 /bin/sh ./test.sh
515      12483 21734 0 11:59 pts/12   00:00:00 grep test
注:本文试验环境为Red Hat Enterprise Linux AS release 4 (Nahant Update 5),shell为/bin/bash,不同的OS和shell可能命令有些不一样。例如AIX的ksh,没有disown,但是可以使用nohup -p PID来获得disown同样的效果。

还有一种更加强大的方式是使用screen,首先创建一个断开模式的虚拟终端,然后用-r选项重新连接这个虚拟终端,在其中执行的任何命令,都能达到nohup的效果,这在有多个命令需要在后台连续执行的时候比较方便:

$ screen -dmS screen_test

$ screen -list
There is a screen on:
        27963.screen_test       (Detached)
1 Socket in /tmp/uscreens/S-jiangfeng.

$ screen -r screen_test

 

三、 nohup 如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户之后继续运行相应的进程。nohup就是不挂起的意思( no hang up)。 该命令的一般形式为:
nohup conmmand &
如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:
nohup command > myout.file 2>&1
在上面的例子中,输出被重定向到myout.file文件中。

 

四、其他命令

jobs:查看当前有多少在后台运行的命令
fg:将后台中的命令调至前台继续运行。

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

如果后台中有多个命令,可以用bg %jobnumber将选中的命令调出,%jobnumber是通过jobs命令查到的后台正在执行的命令的序号(不是pid)

 

分享到:
评论

相关推荐

    java开发的swing客户端,远程执行linux命令.zip

    7. **多线程**:为了防止命令执行阻塞UI线程,通常会将命令执行放在后台线程进行。 在压缩包文件列表中提到的"src"目录,通常包含Java项目的源代码文件。开发者可以在这里找到实现上述功能的具体类和方法,包括...

    车载常用linux命令+火车/高铁/公交车行业+车载linux系统测试常用命令,用于测试职位或运维技术支持职位

    在IT行业中,Linux系统是许多车载设备和交通系统的首选操作系统,因为它的稳定性和...总之,熟练掌握这些Linux命令对于车载Linux系统测试和运维工作至关重要,它们能帮助我们高效地进行系统管理、故障排查和性能优化。

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

    1. 后台执行 一般运行linux上的程序都是执行 .sh 文件(./sh文件...加载一个命令的最后面,表示这个命令放在后台执行 2. 查看后台运行的命令 有两个命令可以来查看,ps 和 jobs。区别在于 jobs 只能查看当前终端后台

    unix(linux)常用命令课程

    - 将命令放在后台运行,可以使用`&`符号,使命令在用户继续输入其他命令时不被阻塞。 - 利用Unix的功能键,如`Ctrl+C`中断命令,`Ctrl+D`退出Shell,`Up/Down`箭头键浏览历史命令。 1.2 文件的存取权限 - `ls -l`...

    巧妙运用前后台任务让Linux系统加速

    对于那些执行时间较长的任务,将其放在后台执行是非常明智的选择。后台任务不会阻塞用户的交互界面,使得用户可以继续进行其他操作,无需等待单个任务完成。例如,要启动一个耗时的`find`命令搜索文件,可以使用`&`...

    linux后台执行命令&和nohup的具体使用方法

    当我们在终端或控制台工作时,可能不希望由于运行一个作业而占住了屏幕,因为可能还有...在后台运行作业时要当心:需要用户交互的命令不要放在后台执行,因为这样你的机器就会在那里傻等。不过,作业在后台运行一样会将

    linux-McFlyBash历史命令高效搜索重用工具

    通过熟练使用McFlyBash,你可以更快地执行常见的任务,更有效地管理和利用你的命令历史,从而将更多的精力放在更重要的工作上。 总之,"Linux-McFlyBash历史命令高效搜索重用工具"是一个强大的Bash扩展,它通过智能...

    Linux Find命令的使用 实现高效精准查找

    Linux下find命令在目录结构中搜索文件,并执行指定的操作。find命令提供了相当多的查找条件,功能很强大。即使系统中含有网络文件系统( NFS)...在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行。

    linux 常用命令及技巧

    `job &`直接将新作业放在后台运行。 #### 12. `kill` `kill`命令用于向进程发送信号。例如,`kill -9 pid`会发送SIGKILL信号,强制终止指定PID的进程。 #### 13. `ps` `ps`命令用于显示当前运行的进程状态。`ps -e...

    Linux上机练习题

    在Linux系统中,命令可以使用&符号放在后台运行,例如command &命令可以将命令放在后台运行。 20. 如何查看指定 rpm 软件是否安装,如果没有安装又该怎样安装 在Linux系统中,rpm软件包可以使用rpm命令查看,例如...

    linux下screen命令的使用

    11. 分离 Screen 会话:在 Screen 会话中键入 C-a d,分离 Screen 会话,并将其放在后台执行。 Screen 命令的优点: 1. 可以创建多个有 shell 的窗口,每个窗口都可以跑自己的应用程序。 2. 即使退出远程管理窗口...

    Linux系统管理.pdf

    例如,将命令放在后台可以通过在命令后面加上"&"来实现。 使用jobs命令可以查看后台的工作,以及它们的状态,如暂停或正在运行。fg命令用于将后台的工作恢复至前台继续执行,而bg命令则用于将后台暂停的工作恢复至...

    linux常用命令大全.docx

    5. **&**: 将命令放在后台执行。例如,`command &`。 #### 五、系统信息 1. **uname**: 显示系统信息。例如,`uname -a`将显示内核版本、架构等信息。 2. **df**: 显示磁盘使用情况。例如,`df -h`将以人类易读的...

    c++代码如何实现在win/linux下创建编译及部署后台服务,并管理其他服务完整示例代码

    在C++编程中,开发跨平台的后台服务是常见的...通过理解和应用以上知识点,你可以在Windows和Linux平台上编写和管理后台服务,从而实现高效的跨平台服务开发。同时,了解服务的生命周期管理和权限控制也是至关重要的。

    Ubuntu下后台持续运行Python程序

    在Ubuntu系统中,后台持续运行Python程序是许多开发者和系统管理员需要掌握的重要技能。这尤其适用于需要长时间运行的...通过实践和学习,你可以有效地管理后台运行的Python应用程序,确保它们稳定、可靠地执行任务。

    linux常用命令与技巧

    本文将根据提供的部分内容,深入解析并扩展一系列常用的Linux命令及其应用技巧,帮助读者更好地理解和运用这些命令。 #### 1. 基础命令 **1.1 date** - **功能**: 显示或设置系统的日期和时间。 - **用法示例**: `...

    Linux中find命令的用法入门

    所以 find 命令很耗资源,有时候甚至会耗费很长时间,因此建议把它放在后台执行。 Find 命令格式如下所示: find pathname -options [-print -exec -ok …] 介绍一种简单易记的格式: find <指定目录> <指定...

Global site tag (gtag.js) - Google Analytics