在服务器中我们经常需要将一些脚本挂在后台继续运行,而不是随着我们切断一段会话就结束了运行,常见的作法有如下几种,下面就进行简单的总结:

0. bg\fg

在 Windows 上面,要么让一个程序作为服务在后台一直运行,要么停止这个服务。而不能让程序在前台后台之间切换。而 Linux 提供了 fg 和 bg 命令,可以轻松调度正在运行的任务。假设你发现前台运行的一个程序需要很长的时间,但是需要干其他的事情,你就可以用 Ctrl-Z ,挂起这个程序,然后可以看到系统提示(方括号中的是作业号):
[1]+ Stopped /root/bin/rsync.sh
然后我们可以把程序调度到后台执行:(bg 后面的数字为作业号)
#bg 1
[1]+ /root/bin/rsync.sh &
用 jobs 命令查看正在运行的任务:
#jobs
[1]+ Running /root/bin/rsync.sh &
如果想把它调回到前台运行,可以用
#fg 1
/root/bin/rsync.sh
这样,你在控制台上就只能等待这个任务完成了。

fg、bg、jobs、&、ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的,一旦会话结束,该任务无论是否完成也会随之结束,于是就有了下面的几种方式。
 

1.nohup

安装:

which nohup    ###查看/usr/bin目录下有没有nohup命令
yum install coreutils  ###安装
###环境配置
vi ~/.bash_profile 
在PATH=$PATH:$HOME/bin后面添加:/usr/bin
source ~/.bashrc
nohup --version  ###查看版本信息

      nohup指不断地运行,是no hang up的缩写,指不间断,不挂断。运行一个进程的时候,不想让其在你退出账号时关闭,即可用nohup。nohup在不规定的情况下,所以输出内容会到nohup.out中【1】

例:

'''
下面第一条代码,以python环境不间断的运行my.py这个脚本,并且将脚本输出的内容重定向输入my.log中(>>意为追加,如果用>会让其中的内容清空),my.py >> my.log 和my.py 1>>my.log相同,只是1(标准输出)被省略了,而后面的my.log 2>&1 又将2(错误内容)输入到标准输出,然后前面的标准输出又输入到my.log中,意思错误和标准内容都会输出到my.log中,其实代码可拆成两块。
第二条代码,也是一样的,将错误和标准全部丢入/dev/null中,全部销毁。
'''
nohup python my.py >> /usr/local/python/xxf/my.log 2>&1 &
nohup tomcat.sh > /dev/null 2>&1 &

nohup python -u flush.py > flush.log 2>&1 & (当前路径下生成flush.log文件,-u表示不启用python缓存)

注意此处不要在大循环里面打印日志,比如  5W次循环 log.info("xxx"),因为会占满日志,导致磁盘满

附:

  • >>是追加内容到日志文件里,只有一个>的话会覆盖源文件内容
  • &是指在后台运行
  • 2>&1是一个整体,>左右不能有空格,即将错误内容重定向输入到标准输出中去。
  • 操作系统中有三个常用的流:

  0:标准输入流 stdin
  1:标准输出流 stdout
  2:标准错误流 stderr

  一般当我们用 > console.txt,实际是 1>console.txt的省略用法;< console.txt ,实际是 0 < console.txt的省略用法。

2、screen

linux下安装:

centos:   yum install screen

ubuntu:   apt-get install screen

使用:

新建一个screen,

screen -S xiedi

这样会新开一个窗口,然后执行命令即可

python manage.py runserver 0.0.0.0:9000

重开一个窗口,运行screen ls列出所有screen进程,如果想进入已存在的一个会话,执行下面命令即可【2】,

screen -r 30299(运行中screen进程id)

同样的与此效果类似的可以查看tmux的使用,一样可以将脚本挂在后台继续运行。

3、setsid

在新session执行命令(使进程不属于接受 HUP 信号的终端的子进程,那么就不会受到 HUP 信号的影响)

使用命令

setsid python a.py
ps -ef | grep a.py  ###后台查看进程
kill -9 进程id   ##结束进程

4、supervisor

supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。

安装:

yum install python-setuptools
easy_install supervisor
apt-get install -y supervisor  ##ubuntu

# yum install epel-release  ###centos
# yum install -y supervisor
# systemctl enable supervisord # 开机自启动
# systemctl start supervisord # 启动supervisord服务

# systemctl status supervisord # 查看supervisord服务状态
# ps -ef|grep supervisord # 查看是否存在supervisord进程

   编写配置文件

配置文件放在 /etc/supervisor/conf.d 目录下。
例如:

[program:mycommand]
command=cat
directory=/home/fenggese/
user=fenggese

更新配置 supervisorctl update

启动进程的命令: supervisorctl start mycommand
终止进程的命令: supervisorctl stop mycommand
注: 终止进程后重启电脑,进程将会重启。 所以要移除某个进程,要把对应的配置删除。

总结:

守护进程(daemon)
守护进程是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。

screen 的意图只是新启动了一个会话窗口,不过因为其副作用,倒是也可以用来做后台任务。

nohup 本身不是后台运行,而是让后面的命令忽略 Linux 的终端关闭信号,需要配合 & 才是后台任务。

但以上两者都阻止不了你程序本身的逻辑代码里有错误导致的退出。假设你程序挂了,你还能 7*24 盯着服务器、随时登录上去重新执行一下 nohup + &screen 吗?而supervisor 是一个 python 写的守候进程,需要你写一个配置文件,然后他就会按照你的配置文件的要求,守候你的进程,比如失败了是否要重启啊,重启几次啊?失败了是否要发邮件啊,stdout 和 stderr 都输出到哪里啊?怎么轮换日志啊,日志多大啊,运行用户是谁啊等等,还是很方便的,甚至还有一个 web 管理页面可以给你使用.

nohup 是 linux 自带的,这个,我觉得他都不能叫做守候进程, 他只是把进程变成了后台运行程序,但是他不会守候这个进程.挂了就挂了吧.他只保证你用户会话终止时,程序不终止.

linux 下还有一个 systemd, 基本上提供 systemd 的 linux 发行版,整个 linux 的启动和服务进程依赖都是由 systemd 来管理的.配置比较简单,功能也比较简单.但是基本满足你作为守候进程的使用吧.如果你是要守候进程, systemd 和 supervisor 都可以,supervisor 这一个应用软件,通过配置行使守护进程的职责,程序或应用由于某种原因中断或挂掉的时候,它会自动的去启动或重启这个程序(通过你在配置文件里配置的启动或重启命令)来启动应用,在业界被称为:永不宕机的神器(守护神)【3】。

 未完待续!

参考文件:

1、https://www.cnblogs.com/kex1n/p/8285343.html

2、https://www.jianshu.com/p/2a29d8243f43

3、https://www.h5w3.com/38135.html

GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐