添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
健壮的皮带  ·  Eclipse JavaEE ...·  7 月前    · 
无邪的打火机  ·  How Focusing on ...·  11 月前    · 
飘逸的机器猫  ·  optimistic ...·  1 年前    · 
买醉的小熊猫  ·  flutter_blue + ...·  1 年前    · 

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

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

第一种方法不推荐使用第二种方法——在需要查看日志的情况下,建议使用(无需在关闭的那种)第三种方法——在开启后,还需要关闭或还需要输入一些命令的时候下第四种方法——虽然需要学习的时间比前面几种长,但是学会之后,会很方便。 在Linux系统中,通常我们在执行一些运行时间比较长的任务时,必须等待执行完毕才能断开SSH连接或关闭客户端软件,否则可能会导致执行中断。本文介绍几种保障程序在用户退出登录后持续运行的方法。 今天做了个数据库的备份脚本,顺便系统得学习一下Linux下定时执行脚本的设置。Linux下的定时执行主要是使用crontab文件中加入定制计划来执行,设置比Windows略微复杂一些(因为没有图形界面嘛),但是也不是很复杂,基本上用过一遍就能记住了,关键是要记住/var/spool/cron这个目录。下面看一下具体的使用方法:首先查看一下/etc/crontab文件:$ cat /etc/cron... 我们使用Linux搭建服务器之后,经常需要在服务器上运行一些脚本,例如定期检查网络连通性并保存出错日志等。在写好批处理shell文件(.sh)文件之后,如果是Ubuntu系统,直接登陆上去之后单独启动一个终端并运行.sh文件就可以了。但是如果是没有GUI的Cent OS的话,在我们断开连接、关闭终端之后,终端上所运行的脚本也会随之终止。因此,需要使用特定的命令,让脚本即使在终端关闭后也能保持在后台运行。下文所介绍的方法,通用于Ubuntu和Cent OS。 shell脚本linux重启之后继续运行问题可以创建一个标识文件,判断该标识文件不存在则先创建标识文件再执行重启命令若该文件存在则继续执行下面的代码并且配合linux的自启动服务来完成当然也可以不创建自启动服务,连续运行两次脚本也可以也就是在未重启之前运行一次脚本,liunx会重启,重启之后,在运行一次脚本,就会执行重启之后的命令。 3.然后再使用 disown -h %[job_id]来切断这个命令与当前shell进程的联系.1.可以先用 Ctrl+z来挂起当前进程,使用jobs获得作业号.2.利用 bg %[job_id]后台继续运行该命令.4.这样就可以避免shell关闭的时候会中断命令的执行。 文章目录1.1 将shell脚本放在后台运行的方式1.2 &不是英文导致的大事故1.3 nohup配合&来使用,就不怕了 1.1 将shell脚本放在后台运行的方式 这个有很多种方式哈,可以百度。我常用以下两种 ####### 我常用的两种 & # 放在后台运行,但要注意了,不能是中文的哈。 nohup # 放在后台运行,会生成nohup.out文件,但我们可以不让其有这个文件 ####### 我现在这样用 nohup 配合 & 使用,这样就不用 linux shell 的 Linux下服务器重启的脚本命令Linux关闭和重启系统一般使用相同的命令可以实现。在Linux系统下常用在关机/重启命令有shutdown、halt、reboot和init,但每个命令的内部工作过程是不同的。1、shutdown命令Shutdown命令可以安全地关闭系统,有些用户会使用直接断电源的方式来关闭计算机,这是十分危险的。Linux与Windows不同,其后台... 需要在linux后台执行任务的情况还是经常会遇到的,比如一些费时的操作,或者一些需要长时间存在的程序。当然你也可以把这些任务做成守护进程或者后台服务,但这需要额外的工作量。  linux提供了很多方法可以直接将普通的命令、脚本、应用程序以后台的形式运行起来,这样就不会阻塞终端窗口的继续使用。常用的涉及后台执行的命令有十几多个,包括:&、ctrl+z、bg、fg、nohup、disown、setsid、(cmd)、jobs、ps、kill 等。  下面先对每个命令的功能作用做一个简单的介绍,然后分别 直接在后台运行脚本:./test.sh & 查看当前shell环境中已启动的任务情况:jobs 将test.sh切换到前台运行:fg %number(”number”为使用jobs命令查看到的 [ ] 中的数字,不是pid) 中断后台运行的test.sh脚本:先fg %number切换到前台,再ctrl+c;或是直接kill %number 方法2:后台执行