nohup表示进程在当用户注销(logout)或者网络断开时不会被终止。
nohup yourcommand &
# yourcommand:启动对象命令。可以跟该命令需要的各种参数。
# &是指在后台运行,但当用户推出(挂起)的时候,命令自动也跟着退出。 nohup与&结合起来,可以实现不挂断的后台运行。
重定向到日志文件
这样虽然程序可以后台运行了,但是我们都希望之后可以查看程序的运行日志。这里使用重定向将日志保存起来,方便日后查看。
nohup yourcommand 2>&1 &
# 0 – stdin (standard input),1 – stdout (standard output),2 – stderr (standard error) ;
# 2>&1是将标准错误(2)重定向到标准输出(&1),标准输出(&1)再被重定向输入到日志文件中。
如果希望将日志输出到别的文件中,可以增加一个文件路径参数。如下:
nohup yourcommand > myout.log 2>&1 &
其中myout.log是保存输出的文件名称;默认输出到nohup.out文件中;
实时监测日志输出内容命令:tail
tail 命令是nohup命令的好搭档。配合-f参数,可以实时监视向日志文件增加的信息。
- tail -f myout.log (这个真的很好用)
- tail -f 等同于–follow=descriptor,根据文件描述符进行追踪,当文件改名或被删除,追踪停止
- tail -F 等同于–follow=name --retry,根据文件名进行追踪,并保持重试,即该文件被删除或改名后,如果再次创建相同的文件名,会继续追踪
- tailf 等同于tail -f -n 10,与tail -f不同的是,如果文件不增长,它不会去访问磁盘文件,所以tailf特别适合那些便携机上跟踪日志文件,因为它减少了磁盘访问,可以省电。
监测程序是否在正常运行中:ps
ps命令也可以和nohup命令配合使用,用于显示当前进程 (process) 的状态。可以监视后台程序是否在正常运行中或者已经挂掉。
ps -ef|grep yourcommand
# -ef 参数显示所有命令,连带启动时的命令行参数
实践一下~
我现在希望python extract_feature.py这个程序可以后台运行
# nohup python extract_feature.py > nohup.out 2>&1 &
可以实时监控程序输出
# tail -f nohup.out
按ctrl+c退出
查看进程是否存活
(py36) [root@xxx]# ps -aux | grep extract_feature.py
root 5736 98.1 58.7 2366480 1105212 pts/0 Sl 10:36 53:39 python extract_feature.py
root 14504 0.0 0.0 112708 988 pts/0 S+ 11:31 0:00 grep --color=auto extract_feature.py
只看进程号pid, awk '{ print $2}'
(py36) [root@xxx]# ps -aux | grep extract_feature.py | awk '{print $2}'
5736(nohup程序的pid)
14330 (这个是grep本身的pid)
增加这个 grep -v grep,就可以排除grep本身的pid了~
(py36) [root@xxx]# ps -aux|grep extract_feature.py| grep -v grep | awk '{print $2}'
5736 #(这个nohup的进程号)
现在想结束这个进程
kill -9 5736 # kill这个进程
到此就结束了~ !!!
总结一下~
# 1.后台启动程序
nohup Command [ Arg … ] [ & ]
# nohup命令 参数可选但不是必须的,又需要看文档既可
# 举例
# 在后台运行 test.py的python脚本
nohup python test.py &
# 在后台运行uwsgi(下面的只是uwsgi举例)
nohup uwsgi --http :8001 --wsgi-file test.py &
# 执行之后会返回一个进程号
# 以及告诉你程序的标准输出都会保存在一个叫outhup.out的文件中在程序根目录下
# 2.查看此程序运行状态
# 端口状态查看
lsof -i:port
# 某某程序运行状态
ps -ef | grep <程序名>
# 举例
# 查看后台python运行状态
ps -ef | grep python
# 查看后台uwsgi运行状态
ps -ef | grep uwsgi
# jobs这个命令也可查看程序后台运行状态,不过另起一个ssh就出不来了,感觉有点鸡肋
# 3.停掉这个程序,不让他运行了
# 可以把后台程序转到前台,也可以根据进程号直接干掉,这里推荐后者,毕竟方便
# 例如根据 ps -ef | grep <程序名> 得到进程号24365
kill 24365
# 这个进程讲就game over了
# 最最最重要的一点
# 程序在后台运行了之后,不要直接把ssh给关了
# 一但ssh客户端中断,这个进程也就直接挂了
# 所以我们需要exit来退出远程连接,真的是细节决定成败
linux重定向
0、1和2分别表示标准输入、标准输出和标准错误信息输出,可以用来指定需要重定向的标准输入或输出。
在一般使用时,默认的是标准输出,既1。当我们需要特殊用途时,可以使用其他标号。
例如,将某个程序的错误信息输出到log文件中:./program 2>log。
这样标准输出还是在屏幕上,但是错误信息会输出到log文件中。
另外,也可以实现0,1,2之间的重定向。2>&1:将错误信息重定向到标准输出。
Linux下还有一个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。
这一点非常有用,当我们不需要回显程序的所有信息时,就可以将输出重定向到/dev/null。
如果想要正常输出和错误信息都不显示,则要把标准输出和标准错误都重定向到/dev/null, 例如:
# ls 1>/dev/null 2>/dev/null
还有一种做法是将错误重定向到标准输出,然后再重定向到 /dev/null,例如:
# ls >/dev/null 2>&1
注意:此处的顺序不能更改,否则达不到想要的效果,此时先将标准输出重定向到 /dev/null,然后将标准错误重定向到标准输出。
由于标准输出已经重定向到了/dev/null,因此标准错误也会重定向到/dev/null,于是一切静悄悄。
■关于nohup
在使用nohup命令的时候,经常由于输出nohup.out的路径没有写入权限,而无法使用nohup。
这是可以使用Linux重定向的方法,将nohup.out重定向至一个有写入权限的路径,或者直接扔到/dev/null中。
nohup ./program >/dev/null 2>/dev/null & 或者 nohup ./program >/dev/null 2>&1 &
除此之外,还有很多其他方法使得程序在后台运行
setsid
[root@pvcent107 ~]# setsid ping www.ibm.com
[root@pvcent107 ~]# ps -ef |grep www.ibm.com
root 31094 1 0 07:28 ? 00:00:00 ping www.ibm.com
root 31102 29217 0 07:29 pts/4 00:00:00 grep www.ibm.com
[root@pvcent107 ~]#
参考: