Linux nohup命令原理及实例解析_Linux

来源:脚本之家  责任编辑:小易  

linux的nohup命令的用法。在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会 用&在程序结尾来让程序自动运行。比如我们要运行mysql在后台:/usr/local/mysql/bin/mysqld_safe –user=mysql&。可是有很多程序并不想mysqld一样,这样我们就需要nohup命令,怎样使用nohup命令呢?这里讲解nohup命令的一些用法。nohup/root/start.sh&在shell中回车后提示:[~]$appending output to nohup.out 原程序的的标准输出被自动改向到当前目录下的nohup.out文件,起到了log的作用。但是有时候在这一步会有问题,当把终端关闭后,进程会自动被关闭,察看nohup.out可以看到在关闭终端瞬间服务自动关闭。咨询红旗Linux工程师后,他也不得其解,在我的终端上执行后,他启动的进程竟然在关闭终端后依然运行。在第二遍给我演示时,我才发现我和他操作终端时的一个细节不同:他是在当shell中提示了nohup成功后还需要按终端上键盘任意键退回到 shell输入命令窗口,然后通过在shell中输入exit来退出终端;而我是每次在nohup执行成功后直接点关闭程序按钮关闭终端.所以这时候会 断掉该命令所对应的session,导致nohup对应的进程被通知需要一起shutdown。这个细节有人和我一样没注意到,所以在这儿记录一下了。附:nohup命令参考 nohup 命令 用途:不挂断地运行命令。语法:nohup Command[Arg…][&]描述:nohup 命令运行由 Command 参数和任何相关的 Arg 参数指定的命令,忽略所有挂断(SIGHUP)信号。在注销后使用 nohup 命令运行后台中的程序。要运行后台中的 nohup 命令,添加&(表示”and”的符号)到命令的尾部。无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到$HOME/nohup.out 文件中。如果没有文件能创建或打开以用于追加,那么 Command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。退出状态:该命令返回下列出口值:126 可以查找但不能调用 Command 参数指定的命令。127 nohup 命令发生错误或不能查找由 Command 参数指定的命令。否则,nohup 命令的退出状态是 Command 参数指定命令的退出状态。nohup命令及其输出文件 nohup命令:如果你正在运行一个进程,而且你觉得在退出帐户时该进程还不会结束,那么可以使用nohup命令。该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。nohup就是不挂起的意思(n ohang up)。该命令的一般形式为:nohup command&使用nohup命令提交作业 如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:nohup command>myout.file 2>&1&在上面的例子中,输出被重定向到myout.file文件中。使用 jobs 查看任务。使用 fg%nwww.zgxue.com防采集请勿采集本网。

nohup命令

nohup./run.sh&就可以了 更多的这方面的知识欢迎查看《Linux就该这么学》这本经典书籍。

在应用Unix/Linux时,我们一般想让某个程序在后台运行,于是我们将常会用 & 在程序结尾来让程序自动运行。比如我们要运行mysql在后台: /usr/local/mysql/bin/mysqld_safe –user=mysql &。可是有很多程序并不想mysqld一样,这样我们就需要nohup命令

nohup 后台运行忽略中断信号 相当于一个不死进程 screen 可以理解为开启了一个不死界面环境

进程和作业管理

这个应该是run.sh这个脚本自己的参数

nohup命令可以将程序以忽略挂起信号的方式运行起来,被运行的程序的输出信息将不会显示到终端。

命令不行,但是可以把程序作成服务 或者计划任务,在计划任务高级属性里有个“与用户桌面交互”的选项,不交互就是在后台运行了

无论是否将 nohup 命令的输出重定向到终端,输出都将附加到当前目录的 nohup.out 文件中。如果当前目录的 nohup.out 文件不可写,输出重定向到$HOME/nohup.out文件中。如果没有文件能创建或打开以用于追加,那么 command 参数指定的命令不可调用。如果标准错误是一个终端,那么把指定的命令写给标准错误的所有输出作为标准输出重定向到相同的文件描述符。

用不着,多此一举了,直接*

语法

nohup(选项)(参数)

选项

--help:在线帮助;

--version:显示版本信息。

参数

程序及选项:要运行的程序及选项。

实例

一.

运行spring boot 的jar包,当当前终端关闭后,该Spring Boot项目仍然在后台运行。

nohup java -jar springboot.jar &  

二.

使用nohup命令提交作业,如果使用nohup命令提交作业,那么在缺省情况下该作业的所有输出都被重定向到一个名为nohup.out的文件中,除非另外指定了输出文件:

nohup command > myout.file 2>&1 &

在上面的例子中,输出被重定向到myout.file文件中

nohup/setsid/场景:如果只是临时有一个命令需要长时间运行,什么方法能最简便的保证它在后台稳定运行呢?hangup 名称的来由在 Unix 的早期版本中,每个终端都会通过 modem 和系统通讯。当用户 logout 时,modem 就会挂断(hang up)电话。同理,当 modem 断开连接时,就会给终端发送 hangup 信号来通知其关闭所有子进程。解决方法:我们知道,当用户注销(logout)或者网络断开时,终端会收到 HUP(hangup)信号从而关闭其所有子进程。因此,我们的解决办法就有两种途径:要么让进程忽略 HUP 信号,要么让进程运行在新的会话里从而成为不属于此终端的子进程。1.nohupnohup 无疑是我们首先想到的办法。顾名思义,nohup 的用途就是让提交的命令忽略 hangup 信号。让我们先来看一下 nohup 的帮助信息:NOHUP(1)User Commands NOHUP(1)NAMEnohup-run a command immune to hangups,with output to a non-ttySYNOPSISnohup COMMAND[ARG].nohup OPTIONDESCRIPTIONRun COMMAND,ignoring hangup signals.help display this help and exitversionoutput version information and exit可见,nohup 的使用是十分方便的,只需在要处理的命令前加上 nohup 即可,标准输出和标准错误缺省会被重定向到 nohup.out 文件中。一般我们可在结尾加上"&"来将命令同时放入后台运行,也可用">filename 2>&1"来更改缺省的重定向文件名。nohup 示例[root@pvcent107~]#nohup ping www.ibm.com &[1]3059nohup:appending output to `nohup.out'[root@pvcent107~]#ps-ef|grep 3059root 3059 984 0 21:06 pts/3 00:00:00 ping www.ibm.comroot 3067 984 0 21:06 pts/3 00:00:00 grep 3059[root@pvcent107~]#2。setsidnohup无疑能通过忽略 HUP 信号来使我们的进程避免中途被中断,但如果我们换个角度思考,如果我们的进程不属于接受 HUP信号的终端的子进程,那么自然也就不会受到 HUP 信号的影响了。setsid 就能帮助我们做到这一点。让我们先来看一下 setsid的帮助信息:SETSID(8)Linux Programmer’s Manual SETSID(8)NAMEsetsid-run a program in a new sessionSYNOPSISsetsid program[arg.]DESCRIPTIONsetsid runs a program in a new session.可见 setsid 的使用也是非常方便的,也只需在要处理的命令前加上 setsid 即可。setsid 示例[root@pvcent107~]#setsid ping www.ibm.com[root@pvcent107~]#ps-ef|grep www.ibm.comroot 31094 1 0 07:28?00:00:00 ping www.ibm.comroot 31102 29217 0 07:29 pts/4 00:00:00 grep www.ibm.com[root@pvcent107~]#值得注意的是,上例中我们的进程 ID(PID)为31094,而它的父 ID(PPID)为1(即为 init 进程 ID),并不是当前终端的进程 ID。请将此例与nohup 例中的父 ID 做比较。3。这里还有一个关于 subshell 的小技巧。我们知道,将一个或多个命名包含在“()”中就能让这些命令在子 shell 中运行中,从而扩展出很多有趣的功能,我们现在要讨论的就是其中之一。当我们将"&"也放入“()”内之后,我们就会发现所提交的作业并不在作业列表中,也就是说,是无法通过jobs来查看的。让我们来看看为什么这样就能躲过 HUP 信号的影响吧。subshell 示例[root@pvcent107~]#(ping www.ibm.com &)[root@pvcent107~]#ps-ef|grep www.ibm.comroot 16270 1 0 14:13 pts/4 00:00:00 ping www.ibm.comroot 16278 15362 0 14:13 pts/4 00:00:00 grep www.ibm.com[root@pvcent107~]#从上例中可以看出,新提交的进程的父 ID(PPID)为1(init 进程的 PID),并不是当前终端的进程 ID。因此并不属于当前终端的子进程,从而也就不会受到当前终端的 HUP 信号的影响了。回页首disown场景:我们已经知道,如果事先在命令前加上 nohup 或者 setsid 就可以避免 HUP 信号的影响。但是如果我们未加任何处理就已经提交了命令,该如何补救才能让它避免 HUP 信号的影响呢?解决方法:这时想加 nohup 或者 setsid 已经为时已晚,只能通过作业调度和 disown 来解决这个问题了。让我们来看一下 disown 的帮助信息:disown[-ar][-h][jobspec.]Without options,each jobspec is removed from the table ofactive jobs.If the-h option is given,each jobspec is notremoved from the table,but is marked so that SIGHUP is notsent to the job if the shell receives a SIGHUP.If no jobspecis present,and neither the-a nor the-r option is supplied,the current job is used.If no jobspec is supplied,the-aoption means to remove or mark all jobs;the-r option withouta jobspec argument restricts operation to running jobs.Thereturn value is 0 unless a jobspec does not specify a validjob.可以看出,我们可以用如下方式来达成我们的目的。灵活运用 CTRL-z在我们的日常工作中,我们可以用 CTRL-z 来将当前进程挂起到后台暂停运行,执行一些别的操作,然后再用 fg 来将挂起的进程重新放回前台(也可用bg来将挂起的进程放在后台)继续运行。这样我们就可以在一个终端内灵活切换运行多个任务,这一点在调试代码时尤为有用。因为将代码编辑器挂起到后台再重新放回时,光标定位仍然停留在上次挂起时的位置,避免了重新定位的麻烦。用disown-h jobspec来使某个作业忽略HUP信号。用disown-ah 来使所有的作业都忽略HUP信号。用disown-rh 来使正在运行的作业忽略HUP信号。需要注意的是,当使用过 disown 之后,会将把目标作业从作业列表中移除,我们将不能再使用jobs来查看它,但是依然能够用ps-ef查找到它。但是还有一个问题,这种方法的操作对象是作业,如果我们在运行命令时在结尾加了"&"来使它成为一个作业并在后台运行,那么就万事大吉了,我们可以通过jobs命令来得到所有作业的列表。但是如果并没有把当前命令作为作业来运行,如何才能得到它的作业号呢?答案就是用 CTRL-z(按住Ctrl键的同时按住z键)了!CTRL-z 的用途就是将当前进程挂起(Suspend),然后我们就可以用jobs命令来查询它的作业号,再用bg jobspec来将它放入后台并继续运行。需要注意的是,如果挂起会影响当前进程的运行结果,请慎用此方法。disown 示例1(如果提交命令时已经用“&”将命令放入后台运行,则可以直接使用“disown”)[root@pvcent107 build]#cp-r testLargeFile largeFile&[1]4825[root@pvcent107 build]#jobs[1]+Running cp-i-r testLargeFile largeFile&[root@pvcent107 build]#disown-h%1[root@pvcent107 build]#ps-ef|grep largeFileroot 4825 968 1 09:46 pts/4 00:00:00 cp-i-r testLargeFile largeFileroot 4853 968 0 09:46 pts/4 00:00:00 grep largeFile[root@pvcent107 build]#logoutdisown 示例2(如果提交命令时未使用“&”将命令放入后台运行,可使用 CTRL-z 和“bg”将其放入后台,再使用“disown”)[root@pvcent107 build]#cp-r testLargeFile largeFile2[1]+Stopped cp-i-r testLargeFile largeFile2[root@pvcent107 build]#bg%1[1]+cp-i-r testLargeFile largeFile2&[root@pvcent107 build]#jobs[1]+Running cp-i-r testLargeFile largeFile2&[root@pvcent107 build]#disown-h%1[root@pvcent107 build]#ps-ef|grep largeFile2root 5790 5577 1 10:04 pts/3 00:00:00 cp-i-r testLargeFile largeFile2root 5824 5577 0 10:05 pts/3 00:00:00 grep largeFile2[root@pvcent107 build]#回页首screen场景:我们已经知道了如何让进程免受 HUP 信号的影响,但是如果有大量这种命令需要在稳定的后台里运行,如何避免对每条命令都做这样的操作呢?解决方法:此时最方便的方法就是 screen了。简单的说,screen 提供了 ANSI/VT100 的终端模拟器,使它能够在一个真实终端下运行多个全屏的伪终端。screen的参数很多,具有很强大的功能,我们在此仅介绍其常用功能以及简要分析一下为什么使用 screen 能够避免 HUP 信号的影响。我们先看一下screen 的帮助信息:SCREEN(1)SCREEN(1)NAMEscreen-screen manager with VT100/ANSI terminal emulationSYNOPSISscreen[-options][cmd[args]]screen-r[[pid.]tty[.host]]screen-r sessionowner/[[pid.]tty[.host]]DESCRIPTIONScreen is a full-screen window manager that multiplexes a physicalterminal between several processes(typically interactive shells).Each virtual terminal provides the functions of a DEC VT100 terminaland,in addition,several control functions from the ISO 6429(ECMA48,ANSI X3.64)and ISO 2022 standards(e.g.insert/delete line andsupport for multiple character sets).There is a scrollback historybuffer for each virtual terminal and a copy-and-paste mechanism thatallows moving text regions between windows.使用 screen 很方便,有以下几个常用选项:用screen-dmS session name来建立一个处于断开模式下的会话(并指定其会话名)。用screen-list 来列出所有会话。用screen-r session name来重新连接指定会话。用快捷键CTRL-a d 来暂时断开当前会话。screen 示例[root@pvcent107~]#screen-dmS Urumchi[root@pvcent107~]#screen-listThere is a screen on:12842.Urumchi(Detached)1 Socket in/tmp/screens/S-root.[root@pvcent107~]#screen-r Urumchi当我们用“-r”连接到 screen 会话后,我们就可以在这个伪终端里面为所欲为,再也不用担心 HUP 信号会对我们的进程造成影响,也不用给每个命令前都加上“nohup”或者“setsid”了。这是为什么呢?让我来看一下下面两个例子吧。1.未使用 screen 时新进程的进程树[root@pvcent107~]#ping www.google.com &[1]9499[root@pvcent107~]#pstree-H 9499init─┬─Xvncacpidatd2*[sendmail]sshd─┬─sshd─bash─pstreesshd─bash─ping我们..内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • linux后台执行命令&和nohup的具体使用方法
  • linux nohup实现后台运行程序及查看(nohup与&)
  • 详解linux下nohup日志输出过大问题解决方案
  • linux &、nohup与systemctl的使用
  • 浅析linux中使用nohup及screen运行后台任务的示例和区别
  • linux nohup及tail-f用法
  • 解决python nohup linux 后台运行输出的问题
  • php守护进程 加linux命令nohup实现任务每秒执行一次
  • springboot整合activiti7的实现代码
  • 详解ubuntu搭建java开发环境
  • 网站加速vps篇 memcache和memcached安装方法
  • apache配置 虚拟转向实例
  • linux下自动删除归档日志文件的方法
  • linux 命名管道实例详解
  • 在centos7下安装python3的步骤
  • 详解centos7虚拟机安装elasticsearch5.0.x-安装篇
  • centos 6.4系统下编译安装lnmp和配置php环境具体步骤
  • linux用户自定义at、cron计划任务执行的方法
  • linux命令里面 nohup命令和 & 是不是一个意思啊,不挂断是什么意思。
  • linux 系统中 nohup命令如何使用?
  • linux命令nohup和screen命令的区别
  • linux 中nohup命令是干什么的
  • linux 系统中 nohup命令如何使用?
  • Linux命令nohup和screen命令的区别
  • linux关于nohup常用命令
  • linux 下面使用nohup不间断运行, 那windows下面可以使用命令让程序在windows里面不间断运行么
  • Linux,在crontab里面可以放入nohup *** & 的命令形式吗?
  • nohup命令怎么让Linux程序永远在后台执行
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全星外虚拟主机华众虚拟主机linuxwin服务器ftp服务器dns服务器tomcat nginxzabbix云和虚拟化服务器其它首页服务器linuxlinux后台执行命令&和nohup的具体使用方法linux nohup实现后台运行程序及查看(nohup与&)详解linux下nohup日志输出过大问题解决方案linux &、nohup与systemctl的使用浅析linux中使用nohup及screen运行后台任务的示例和区别linux nohup及tail-f用法解决python nohup linux 后台运行输出的问题php守护进程 加linux命令nohup实现任务每秒执行一次springboot整合activiti7的实现代码详解ubuntu搭建java开发环境网站加速vps篇 memcache和memcached安装方法apache配置 虚拟转向实例linux下自动删除归档日志文件的方法linux 命名管道实例详解在centos7下安装python3的步骤详解centos7虚拟机安装elasticsearch5.0.x-安装篇centos 6.4系统下编译安装lnmp和配置php环境具体步骤linux用户自定义at、cron计划任务执行的方法apache开启.htaccess及.htaccessservice temporarily unavailabllinux下实现免密码登录(超详细)apache rewrite url重定向功能的linux下用cron定时执行任务的方法apache性能测试工具ab使用详解centos 6.4安装配置lamp服务器(a阿里云服务器ping不通解决办法(centos+nginx+php+mysql详细配置apache you don""t have permiss详解xampp和wordpress在centos7上的搭建与liunx系统命令中tree命令详解linux expect实现登陆远程主机并执行命令linux 文件系统的操作实现详解linux多线程使用信号量同步linux vps利用ssh重置root密码的方法详解linux usb host驱动编写入门linux中的who命令实例介绍linux应用程序使用写文件调试程序的方法centos7.2搭建lamp环境的具体操作方法
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved