在linux命令行中,如果某条命令需要执行的时间非常长,则可把该条命令放在后台执行,这样就可以继续在该命令行窗口干其他事情,同时不影响之前那条命令继续执行,linux中针对该问题有一个nohup的命令可实现。

nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思( n ohang up)。

 

语法:nohup Command [ Arg … ] [ & ]

描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加 & ( 表示”and”的符号)到命令的尾部。

如命令 nohup sh test.sh > test.log &

表示将脚本文件test.sh的执行放于后台,将test.sh中打印的信息转到test.log中,后面的&表示即使terminal(终端)关闭,或者电脑死机程序依然运行(前提是你把程序递交到服务器上); 

上述中,>test.log其实是1>test.log的缩写,表示的是将标准输出重定向到test.log文件中,使用2>error.log则表示将标准错误输出重定向到error.log文件中。

而0< 则是标准输入了。 

若是将上述命令写为nohup sh test.sh >test.log 2>&1 &

解释:最后的&已经在上面解释了,而2>&1则是表示把标准错误(2)重定向到标准输出中(1),而标准输出又导入文件test.log里面,所以最后的结果是标准错误和标准输出都导入文件test.log里面了。 

至于为什么需要将标准错误重定向到标准输出的原因,那就归结为标准错误没有缓冲区,而stdout有。 

如果写为:nohup sh test.sh >test.log 2>test.log ,文件test.log被两次打开,而stdout和stderr将会竞争覆盖,这肯定不是我门想要的。

这就是为什么有人会写成: 

nohup sh test.sh >test.log 2>test.log出错的原因了 

注意:如果在执行完nohup之后,直接按终端的关闭按钮关闭终端,则会导致断掉该命令所对应的session,导致nohup对应的进程被通知需要一起shutdown。这样,nohup的进程就停止了。只有在执行nohup之后,按终端上键盘任意键退回到shell输入命令窗口,然后通过在shell中输入exit来退出终端,该进程才会继续在后台执行。

退出状态:该命令返回下列出口值:

126 可以查找但不能调用 Command 参数指定的命令。

127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。

否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。

当后台要执行多个脚本时,最好是每个窗口执行一个,若在同一个窗口执行,下个执行命令需要等待前面一个执行完成才能执行,

这种效率不是我们要的。

查看运行的后台进程

 

jobs   只能查看当前窗口的后台进程,如果关闭了后台执行脚本的窗口,该命令失效,这个时候就只能用到下面的命令查看

ps -ef    可以查看主机所有运行的进程   ps -ef | grep 过滤条件

也可以使用ps aux |grep 过滤条件

************************************************************************************

 

ps aux输出格式:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

 

格式说明:

USER: 行程拥有者

PID: pid

%CPU: 占用的 CPU 使用率

%MEM: 占用的记忆体使用率

VSZ: 占用的虚拟记忆体大小

RSS: 占用的记忆体大小

TTY: 终端的次要装置号码 (minor device number of tty)

 

STAT: 该行程的状态,linux的进程有5种状态:

D 不可中断 uninterruptible sleep (usually IO)

R 运行 runnable (on run queue)

S 中断 sleeping

T 停止 traced or stopped

Z 僵死 a defunct (”zombie”) process

注: 其它状态还包括W(无驻留页), <(高优先级进程), N(低优先级进程), L(内存锁页).

 

START: 行程开始时间

TIME: 执行的时间

COMMAND:所执行的指令

 

***************************************************************************************

 

 

fg %n将后台脚本调到前台执行

 

fg %n  将当前后台运行程序调到前台执行

如果执行完后台脚本命令,当前窗口没有关闭,可以执行jobs查看当前窗口运行的后台进程的进程号,再通过fg %n,将此后台进程调到前台执行,如果不想执行该脚本,直接ctl +c 关闭该窗口

 

终止后台运行的删除脚本

 

删除命令:kill -9  进程号

注意:删除的时候不能删除查找查找命令,否则会照成关机

 

Logo

更多推荐