<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>https://jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>https://jackxiang.com/post//</link>
<title><![CDATA[[实践OK]让Linux终端中执行的程序在后台并脱离终端运行 从前台变到后台，相关于把nohup的进程的输出放到前端。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[Unix/LinuxC技术]]></category>
<pubDate>Fri, 07 Nov 2014 12:06:39 +0000</pubDate> 
<guid>https://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	背景：这种情况一般是干下文件啥的，你在你亲戚家下载大文件到你的vps linux上，突然有事说要停电，此时正在一半，怎么办，那就是把当前进程放后台执行，第二步是脱离终端，于是你可以关掉ssh，走路坐车回家再看下完没有，下面这就是干这事的。<br/>0）特别注意别一直有输入，用wget时有输入，这样对于第3部就需要按回车一瞬间输入命令，比较麻烦。<br/>1）ctrl + Z （暂停）<br/>2）bg %1<br/>3）看通过2推到后台后还在下没（PID=6193）：<br/>jobs -l<br/>[1]+&nbsp;&nbsp;6193 Running&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; wget http://download.virtualbox.org/virtualbox/4.3.18/VirtualBox-4.3-4.3.18_96516_el6-1.x86_64.rpm &amp;<br/>4）后台，还没有脱离终端，于是，还得脱离终端：<br/>(1)disown -h %1&nbsp;&nbsp;<br/>(2)nohup -p 6193&nbsp;&nbsp;[Linux下再开一个算是优点，第(1)个有个问题是只能在当前脱离终端里输入，新开终端无效，这样试试，发现： 我的是centos好像没有这个选项。]没有disown，但是可以使用nohup -p PID来获得disown同样的效果。<br/>关掉终端，在其它终端再ps下，还在，不错：<br/>ps aux&#124;grep wget<br/>root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6193&nbsp;&nbsp;0.1&nbsp;&nbsp;0.0 138500&nbsp;&nbsp;2512 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;19:40&nbsp;&nbsp; 0:03 wget http://download.virtualbox.org/virtualbox/4.3.18/VirtualBox-4.3-4.3.18_96516_el6-1.x86_64.rpm<br/><br/>在Linux中，如果要让进程在后台运行，一般情况下，我们在命令后面加上&amp;即可，实际上，这样是将命令放入到一个作业队列中了：<br/>　　$ ./test.sh &amp;<br/>　　[1] 17208<br/>　　$ jobs -l<br/>　　[1]+ 17208 Running ./test.sh &amp;<br/>　　对于已经在前台执行的命令，也可以重新放到后台执行，首先按ctrl+z暂停已经运行的进程，然后使用bg命令将停止的作业放到后台运行：<br/>　　$ ./test.sh<br/>　　[1]+ Stopped ./test.sh<br/>　　$ bg %1<br/>　　[1]+ ./test.sh &amp;<br/>　　$ jobs -l<br/>　　[1]+ 22794 Running ./test.sh &amp;<br/>　　<br/>但是如上方到后台执行的进程，其父进程还是当前终端shell的进程，而一旦父进程退出，则会发送hangup信号给所有子进程，子进程收到hangup以后也会退出。如果我们要在退出shell的时候继续运行进程，则需要使用nohup忽略hangup信号，或者 setsid将将父进程设为init进程(进程号为1)<br/>　　$ echo $$<br/>　　21734<br/>　　$ nohup ./test.sh &amp;<br/>　　[1] 29016<br/>　　$ ps -ef &#124; grep test<br/>　　515 29710 21734 0 11:47 pts/12 00:00:00 /bin/sh ./test.sh<br/>　　515 29713 21734 0 11:47 pts/12 00:00:00 grep test<br/> <br/>　　$ setsid ./test.sh &amp;<br/>　　[1] 409<br/>　　$ ps -ef &#124; grep test<br/>　　515 410 1 0 11:49 ? 00:00:00 /bin/sh ./test.sh<br/>　　515 413 21734 0 11:49 pts/12 00:00:00 grep test<br/>　　上面的试验演示了使用nohup/setsid加上&amp;使进程在后台运行，同时不受当前shell退出的影响。那么对于已经在后台运行的进程，该怎么办呢？可以使用disown命令：<br/>　　$ ./test.sh &amp;<br/>　　[1] 2539<br/>　　$ jobs -l<br/>　　[1]+ 2539 Running ./test.sh &amp;<br/><br/>摘自：http://blog.sina.com.cn/s/blog_605f5b4f0100x2bq.html<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; http://blog.csdn.net/shahongzhou/article/details/25706315<br/><br/>[root@pvcent107 ~]# (ping www.ibm.com &amp;)<br/>[root@pvcent107 ~]# ps -ef &#124;grep www.ibm.com<br/>root&nbsp;&nbsp;&nbsp;&nbsp; 16270&nbsp;&nbsp;&nbsp;&nbsp; 1&nbsp;&nbsp;0 14:13 pts/4&nbsp;&nbsp;&nbsp;&nbsp;00:00:00 ping www.ibm.com<br/>root&nbsp;&nbsp;&nbsp;&nbsp; 16278 15362&nbsp;&nbsp;0 14:13 pts/4&nbsp;&nbsp;&nbsp;&nbsp;00:00:00 grep www.ibm.com<br/>[root@pvcent107 ~]#&nbsp;&nbsp; <br/>从上例中可以看出，新提交的进程的父 ID（PPID）为1（init 进程的 PID），并不是当前终端的进程 ID。因此并不属于当前终端的子进程，从而也就不会受到当前终端的Linux HUP信号的影响了。当我们将&quot;&amp;&quot;也放入“()”内之后，我们就会发现所提交的作业并不在作业列表中，也就是说，是无法通过jobs来查看的。以这种方式运行程序，新提交的进程的父 ID为1，并不是当前终端的进程 ID。因此并不属于当前终端的子进程，从而也就不会受到当前终端的 HUP 信号的影响了。<br/><br/>==========================================================<br/><br/>kill -HUP pid<br/>其中 pid 是进程标识。如果想要更改配置而不需停止并重新启动服务，请使用该命令。在对配置文件作必要的更改后，发出该命令以动态更新服务配置。<br/>根据约定，当您发送一个挂起信号（信号 1 或 HUP）时，大多数服务器进程（所有常用的进程）都会进行复位操作并重新加载它们的配置文件。以下例子详细的讲解一下用法。<br/>eg1：<br/>显示了向所有正在运行的 Web 服务器进程发送挂起信号的一种方法。<br/>告诉 Web 服务器重新加载其配置文件并对文件进行复位操作<br/>[root@localhost httpd-2.2.13]# ps -A &#124; grep httpd &#124; grep -v grep &#124; awk &#039;&#123; print $1; &#125;&#039; &#124; xargs -L 1 kill -HUP <br/>上面的命令中包含了很多的操作，所以让我们来仔细地看一下管道的每个部分。ps 和 grep 命令用来在所有的进程中搜索 httpd（并且忽略用来搜索 httpd 进程的 grep 进程）。接下来，awk 只显示输出结果中的进程 ID，并将它传递给 xargs。然后，xargs 命令接受每个进程 ID（因为使用了 -L 1 以便一次提取一行内容），并使用kill -HUP 向相应的进程发送一个挂起信号。<br/>eg2：<br/>更改/etc/ssh/sshd_config，将里面的Port改为新端口，比如28，然后 kill -HUP `cat /var/run/sshd.pid` 就行了。<br/>现有连接自己不会断，因为kill -HUP `cat /var/run/sshd.pid` 只是HUP监听的那个，已经建立的连接（不同的 pid）不会断。<br/>然后你在现有账号下面exit，在用新的端口登陆就可以了。<br/><br/><br/><br/><br/>nohup命令可以让你的shell命令忽略SIGHUP信号，即可以使之脱离终端运行；“&amp;”可以让你的命令在后台运行。<br/><br/>以脱离终端的方式在后台运行shell命令有这样几个好处：只要你执行过了命令，那么你的网络中断不会对你有任何影响，并且你就可以关闭终端软件了。<br/><br/>用运程终端登陆Linux后运行的程序，当关闭终端时程序也被终至，下面的方法可以让程序在后台运行。<br/><br/>Unix/Linux下一般比如想让某个程序在后台运行，很多都是使用 &amp; 在程序结尾来让程序自动运行。比如我们要运行mysql在后台：<br/><br/>　　/usr/local/mysql/bin/mysqld_safe --user=mysql &amp;<br/>但是加入我们很多程序并不象mysqld一样做成守护进程，可能我们的程序只是普通程序而已，一般这种程序使用 &amp; 结尾，但是如果终端关闭，那么程序也会被关闭。但是为了能够后台运行，那么我们就可以使用nohup这个命令，比如我们有个test.php需要在后台运行，并且希望在后台能够定期运行，那么就使用nohup：<br/><br/>　　nohup /root/test.php &amp;<br/><br/>setsid<br/>nohup 无疑能通过忽略 HUP 信号来使我们的进程避免中途被中断，但如果换个角度思考，如果进程不属于接受 HUP 信号的终端的子进程，那么自然也就不会受到 HUP 信号的影响了。setsid 就能帮助我们做到这一点。<br/>先来看一下 setsid 的帮助信息：<br/>SETSID(8) Linux Programmer’s Manual SETSID(8) NAME setsid - run a program in a new session SYNOPSIS setsid program [ arg ... ] DESCRIPTION setsid runs a program in a new session.<br/><br/>可见 setsid 的使用也是非常方便的，也只需在要处理的命令前加上 setsid 即可。<br/><br/>示例：<br/># setsid ping www.ibm.com<br/># ps -ef &#124; grep www.ibm.com<br/>root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3052&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;0 06:51 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;00:00:00 ping www.ibm.com<br/>值得注意的是，上例中我们的进程 ID(PID)为3052，而它的父进程ID（PPID）为1（即为 init 进程 ID），并不是当前终端的进程ID。请与nohup例中的父进程ID做比较。<br/><br/>还有一种方法：<br/>(&amp;)<br/>当将命令和“&amp;”都放入“()”内执行后，就会发现所提交的作业并不在作业列表中，也就是说，是无法通过jobs来查看的。让我们来看看为什么这样就能躲过 HUP 信号的影响吧。<br/><br/>示例：<br/># (ping www.ibm.com &amp;)<br/># ps -ef &#124; grep www.ibm.com<br/>root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3113&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;0 07:00 pts/0&nbsp;&nbsp;&nbsp;&nbsp;00:00:00 ping www.ibm.com<br/>可以看出，新提交的进程的父 ID（PPID）为1（init 进程的 PID），并不是当前终端的进程ID。因此并不属于当前终端的子进程，从而也就不会受到当前终端的 HUP 信号影响了。
]]>
</description>
</item><item>
<link>https://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [实践OK]让Linux终端中执行的程序在后台并脱离终端运行 从前台变到后台，相关于把nohup的进程的输出放到前端。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>