【Linux】nohup程序后台运行

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 ~]#

参考:

Linux nohup 实现命令后台运行并输出或记录到指定日志文件

nohup 后台启动程序,并输出到指定日志

Linux 技巧:让进程在后台运行的几种方法

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值