赞
踩
在服务器中我们经常需要将一些脚本挂在后台继续运行,而不是随着我们切断一段会话就结束了运行,常见的作法有如下几种,下面就进行简单的总结:
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。