linux程序后台运行(Linux怎么学)

linux怎么让进程切换到后台运行

一、Shell支持作用控制,有以下命令:

command让进程到后台运行

jobs-l查看后台运行的进程

fg%n让后台运行的进程n到前台来

bg%n让进程n到后台去

PS:"n"为jobs查看到的金城编号

二、执行命令&切换到后台

在linux终端运行命令的时候,在命令尾囧上&符号,就可以让程序在后台运行。

三、切换正在运行的程序到后台

如果程序正在前台运行,可以使用Ctrl+z先把程序暂停,然后用bg%[number]命令把这个程序放在后台运行,这个步分三步若下:

1、暂停程序运行Ctrl+z

Ctrl+z跟系统任务有关的,Ctrl+z可以将一个正在前台执行的命令放到后台。并且暂停。

[Oracle@linuxidc~]$ sh ins.sh

[1]+Stopped ins.sh

2、查看暂停的程序

查看jobs使用jobs或ps命令可以察看正在执行的jobs。.[oracle@linuxidc~]$ jobs-l

[1]+ 4524Stopped ins.shjobs命令执行的结果,+表示是一个当前的作业,-表示当前作业之后的一个作业。

jobs-l选项可显示所有任务的PID,jobs的状态可以是running,stopped。Terminated

3、切换程序之后台

bg将一个在后台的暂停的命令,变成据需执行弱国后台中有多个命令,可以用bg%jobnumber将选中的命令调出

[oracle@linuxidc~]$ bg%1

[oracle@linuxidc~]$ jobs-l

[1]+ 4524Running ins.sh

4.切换程序至前台

也可以用 fg%[number]指令把一个程序掉到前台运行

[oracle@linuxidc~]$ fg%1

。/tcpserv01

linux如何设置程序开机启动后台运行

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

1.让linux忽略终端的hung up信号,不关闭进程;

2.让此进程变为终端的非子进程。

方法一:

在终端输入命令:

#./pso pso.file 21

解释:将pso直接放在后台运行,并把终端输出存放在当前目录下的pso.file文件中。

当客户端关机后重新登陆服务器后,直接查看pso.file文件就可看执行结果(命

令:#cat pso.file)。

或者在终端输入命令:

# nohup./pso pso.file 21

解释:nohup就是不挂起的意思,将pso直接放在后台运行,并把终端输出存放在当前

目录下的pso.file文件中。当客户端关机后重新登陆服务器后,直接查看pso.file

文件就可看执行结果(命令:#cat pso.file)。

方法二:

实现方案就是nohup命令。

例如要启动jboss,可以nohup./run.sh。这样就可以了,结尾的“”符号表示后台启动jboss,从而不影响继续运行其他命令。

但这样有一个问题,nohup命令虽然可以让linux“放过”这个进程,但是nohup会同时把进程的控制台输出重定向到nohup.txt下(默认是这个文件),当然可以重定向为其他的文件,但是输出总会有的。

如果jboss运行很长时间,而且如果有很多控制台输出的话,nohup.txt文件就会变的很大很大。

通常项目中的日志都会输出到特定的日志文件或者输出到数据库中,也就是说控制台的输出对于程序的意义不大,那么可不可以抛弃掉这些输出呢?答案是肯定的。

这里讲解一下linux的重定向(注意,是linux的重定向,不是针对nohup)。

0、1和2分别表示标准输入、标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出。

在一般使用时,默认的是标准输出,既1.当我们需要特殊用途时,可以使用其他标号。例如,将某个程序的错误信息输出到log文件中:./program 2log。这样标准输出还是在屏幕上,但是错误信息会输出到log文件中。

另外,也可以实现0,1,2之间的重定向。21:将错误信息重定向到标准输出。

Linux下还有一个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。

结合nohup,我们可以这样nohup./run.sh/dev/null

这是最简单的一种方式,既保证了程序能够一直后台执行,又能保证不会产生太大的nohup.txt文件。

方法三:

利用的linux的一个机制,让程序在subshell中执行,方法很简单,将命令用括号()括起来即可。

ps-ef| grep test

可以看到run.sh的父进程为1,不是当前终端了,这样就能忽略hung up信号。

当然linux还可以动态的让程序后台运行或不被hung up信号关闭,例如disown命令,setid命令等。

方法四:

如果是使用Ubuntu的话,你可以利用CTRL+ALT+T组合键打开终端。当然你也可以使用超级键(Windows键)打开Dash,搜索“TERM”,然后点击“Term”图标来打开终端窗口。

对于其他的桌面环境来说,例如XFCE、KDE、LXDE、Cinnamon以及MATE,你可以在菜单中找到终端。有些环境会在停靠栏或者面板上面包含终端图标。

通常情况下,你可以在终端里面直接输入应用程序名来启动一个应用程序。比如说,你可以通过输入“firefox”来启动Firefox。

在终端启动应用程序的好处是,你可以包含一些额外的参数。

例如,你可以通过下列命令来打开一个Firefox浏览窗口,然后利用默认的搜索引擎搜索相关信息:

firefox-search"linux.cn"

你可能会注意到,如果你启动Firefox,程序打开以后,回到了终端窗口控制,这就意味着你可以继续在终端进行工作。

通常情况下,如果你在终端启动了应用程序,控制会切换到新启动的应用程序,只有程序被关闭以后才会重新切换到终端控制。这是因为你在前台启动了这个程序。

如果要在Linux终端打开应用程序并且返回终端控制,那么你需要将应用程序启动为后台进程。

和下面所列的命令一样,我们可以通过增加一个()符号,将应用程序在后台启动。

libreoffice

译者注:如果需要加参数的话,记得把符号放在最后。

译者注:一般情况下,关闭终端时,在这个终端启动的后台程序也会被终止,要使终端关闭以后,后台程序依然保持执行可以使用下列命令

nohup command [arg...]

如果应用程序目录没有安装在PATH变量包含的目录里面的话,我们就没有办法直接通过应用程序名来启动程序,必须输入应用程序的整个路径来启动它。

/path/to/yourprogram

如果你不确定程序输入哪个Linux目录结构的话,可以使用find或者location命令来定位它。

可以输入下列符号来找到一个文件:

find/path/to/start/from-name programname

例如,你可以输入下列命令来找到Firefox:

find/-name firefox

命令运行的结果会嗖的一下输出一大堆,别担心,你也可以通过less或者more来进行分页查看。

find/-name firefox| more find/-name firefox| less

当find命令查找到没有权限访问的文件夹时,会报出一条拒绝访问错误,

你可以通过sudo命令来提示权限。当然,如果你没有安装sudo的话,就只能切换到一个拥有权限的用户了。

sudo find/-name firefox| more

如果你知道你要查找的文件在你的当前目录结构中,那么你可以使用点来代替斜杠:

sudo find.-name firefox| more

你可能需要sudo来提升权限,也可能根本就不需要,如果这个文件在你的主目录里面,那么就不需要使用sudo。

有些应用程序则必须要提升权限才能运行,否则你就会得到一大堆拒绝访问错误,除非你使用一个具有权限的用户或者使用sudo提升权限。

这里有个小窍门。如果你运行了一个程序,但是它需要提升权限来操作,输入下面命令试试:

sudo!!

方法五:

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

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

delectate@delectate:~$ totem [1] 8510delectate@delectate:~$有几点需要注意:

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

具有debug输出的进程,需要按enter键进行中断当前debug输出。但是如果程序持续进行printf,你将无法输入任何命令。delectate@delectate:~$ vlc [1] 8850delectate@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 presseddelectate@delectate:~$

//show a clean terminal now**(:8850): CRITICAL**: giop_thread_request_push: assertion `tdata!= NULL’ failed

//仍然在输出数据……

//关闭程序[1]+ Done vlcdelectate@delectate:~$

你无法记录程序的debug输出结果。

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

使用nohup命令:

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

但是当你尝试使用命令:

1nohup command

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

delectate@delectate:~$ nohup vlcnohup: ignoring input and appending output to `nohup.out’

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

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

nohupcommand{option}

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

但是你仍然需要

delectate@delectate:~$ nohup vlc [1] 9045delectate@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文件,你也可以利用重定向来指定输出文件:

nohupcommand{option} myout.file 21

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

其他相关命令:

jobs:查看当前有多少在后台运行的命令

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

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

杀死进程

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

pkill-9 name

killall name

kill pid

命令应用:

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

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

Linux进程后台运行的几种方式

Ctrl+z/bg/nohup/setsid/&

在Linux中,如果要让进程在后台运行,一般情况下,我们在命令后面加上&即可,实际上,这样是将命令放入到一个作业队列中了:

./rsync.sh&# jobs

但是如上方到后台执行的进程,其父进程还是当前终端shell的进程,而一旦父进程退出,则会发送hangup信号给所有子进程,子进程收到hangup以后也会退出。如果我们要在退出shell的时候继续运行进程,则需要使用nohup忽略hangup信号,或者setsid将将父进程设为init进程(进程号为1):对于已经在前台执行的命令,也可以重新放到后台执行,首先按ctrl+z暂停已经运行的进程,然后使用bg命令将停止的作业放到后台运行:bg%1,放回前台运行:%1。

# nohup./rsync.sh&# setsid./rsync.sh&或

#(./rsync.sh&)////在一个subshell中执行# ps-ef|grep rsync

nohup的用途就是让提交的命令忽略 hangup信号,标准输出和标准错误缺省会被重定向到 nohup.out文件中。。一般我们可在结尾加上”&”来将命令同时放入后台运行,也可用”> log.out 2>&1”来更改缺省的重定向文件名。

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

# jobs

# disown-h%1# ps-ef|grep rsync

效果与setid相同,但是disown后无法通过jobs命令查看了。

screen

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

GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换,可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。

# yum install screen-y

常用screen参数:

# screen-S docker-d新建一个名叫docker-d的session,并马上进入

# screen-dmS docker-d新建一个名叫docker-d的session,但暂不进入,可用于系统启动脚本里

# screen-ls列出当前所有session

# screen-r docker-d恢复到zhouxiao这个session,前提是已经是断开状态(-d可以远程断开会话)

# screen-x docker-d连接到离线模式的会话(多窗口同步演示)

# screen./rsync.sh screen创建一个执行脚本的单窗口会话,可以attach进程ID

# screen-wipe检查目前所有的screen作业,并删除已经无法使用的screen作业

正常情况下,当你退出一个窗口中最后一个程序(通常是bash)后,这个窗口就关闭了。另一个关闭窗口的方法是使用C-a k,这个快捷键杀死当前的窗口,同时也将杀死这个窗口中正在运行的进程。

在每个screen session下,所有命令都以 ctrl+a(C-a)开始。

C-a w显示所有窗口列表

C-a k这个快捷键杀死当前的窗口,同时也将杀死这个窗口中正在运行的进程。

C-a d detach,暂时离开当前session

上面只是基本也是最常用的用法,更多请参考man screen或linux screen命令详解。需要了解的是,一个用户创建的screen,其他用户(甚至root)通过screen-ls是看不见的。另外,Ctrl+a在bash下是用来回到行开头,不幸与上面的组合快捷键冲突。

阅读剩余
THE END