在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 进程号
注意:删除的时候不能删除查找查找命令,否则会照成关机