Linux 后台进程

本贴最后更新于 940 天前,其中的信息可能已经水流花落

Linux 守护进程

在 Linux 服务器实际应用中,经常会有需要长时间执行的任务。
这类任务若在前台运行,用户无法进行其他操作或者断开与服务器的连接,否则任务将被中止,便需要守护进程的工具。
本文简要讲解 nohup, tumx, screen ,supervisor 四种方式

nohup

nohup 命令的作用就是让后台工作在离开操作终端时,也能够正确地在后台执行

命令

nohup Command [ Arg … ] [ & ]

参数说明

  • Command:要执行的命令。
  • Arg:一些参数,可以指定输出文件。
  • &:让命令在后台执行,终端退出后命令仍旧执行。

实例:
以下命令在后台执行 /usr/local/ 目录下的 demo.sh 脚本:

nohup /root/demo.sh &

demo.sh 的内容如下:

pwd

在终端如果看到以下输出说明运行成功:

/usr/local

如果要停止运行,你需要使用以下命令查找到 nohup 运行脚本到 PID,然后使用 kill 命令来删除:

ps -aux | grep "demo.sh"

参数说明:

  • a : 显示所有程序
  • u : 以用户为主的格式来显示
  • x : 显示所有程序,不区分终端机

另外也可以使用如下方式:

ps -def | grep "demo.sh # 查找此文件的进程 kill -9 进程号PID # kill PID 来删除。

tumx

nohup 虽然可以在保持在后台一直运行,但是不太便于管理,尤其是对于耗时极长的大数据项目。

为大家介绍一位新朋友——tmux,“Terminal MultipleXer”,意思是“终端复用器”,可以让人们通过一个窗口操作多个会话。

检查安装

CentOS/RedHat/Fedora

sudo yum -y install tmux

tmux 依赖于 libevent 库和 ncurses 库,此过程会自动安装上。

Ubuntu/Debian

sudo apt-get install tmux

基本命令

新建会话

sudo tmux new -s name

-s: session 的缩写,顾名思义,启动了一个全新的 tmux 会话(tmux session),并且把这个会话起名叫作 name。

在这里起名为 roclinux,tmux 会在会话中创建一个窗口(tmux window),就是图中的 0:bash * 表示当前的活跃窗口。

多窗口
命令:按 Ctrl+B 组合键,再单独按一下 C

最底部出现了一个 1:bash,如图,我们在 tmux session 中又创建了一个窗口。

多窗口切换
命令:在按下 Ctrl+B 组合键后,按 相应数字键,就可以切换到相应的窗口了

假如我们要切换到 0:bash 这个窗口:按 Ctrl+B 组合键,按数字 0 键。

挂起会话并保持活跃状态
命令:

sudo watch -n second free

意义:每隔 second 秒更新一次内存使用状态,如果不输入 Ctrl+C,则永远不会退出。

退出当前 session
这个操作并不会导致如上的 watch 命令终止
命令:输入组合键 Ctrl+B,然后输入字母 d
结果:tmux 环境消失,只有一行提示 [detached]:表明已经切断了办公电脑和刚才那个 tmux 之间的桥梁

[root@roclinux ~]# tmux new -s roclinux [detached]

重新连接会话

sudo tmux a -t name

name:要连接的 session 的名字

如果有多个 session,可以列出它们:

sudo tmux ls # 结果 roclinux: 2 windows (created Fri Jan 22 16:30:13 2016) [130x36]

screen

screen 可以提供从单个 SSH 会话中使用多个 shell 窗口(会话)。
当会话被分离或网络中断时,screen 会话中启动的进程仍将运行,你可以随时重新连接到 screen 会话。

检查安装

screen 在一些流行的发行版上已经预安装了,检查是否已经安装。

sudo screen -v # 输出:Screen version 4.00.03 (FAU)

如果在 Linux 中还没有 screen,可以使用系统提供的包管理器安装。
CentOS/RedHat/Fedora

sudo yum -y install screen

Ubuntu/Debian

sudo apt-get -y install screen

基本命令

启动 screen 会话

sudo screen -S name

name :这个 session 的名字,替换为对你会话有意义的名字

分离 screen 会话
要从当前的 screen 会话中分离,你可以按下 Ctrl-A 和 d
所有的 screen 会话仍将是活跃的,你之后可以随时重新连接。

重新连接到 screen 会话

sudo screen -r args

如果你有多个 screen 会话,你可以用 ls 参数列出它们。

sudo screen -ls` There are screens on: 7880.session    (Detached) 7934.session2   (Detached) 7907.session1   (Detached) 3 Sockets in /var/run/screen/S-root

如上可见有三个活跃的 screen 会话,如果想要还原 “session2” 会话,可以执行:

sudo screen -r 7934 # sudo screen -r session2

中止 screen 会话
有几种方法来中止 screen 会话。你可以按下 Ctrl+d,或者在命令行中使用 exit 命令。

要查看 screen 命令所有有用的功能,你可以查看 screen 的 man 手册。

sudo man screen NAME screen - screen manager with VT100/ANSI terminal emulation SYNOPSIS screen [ -options ] [ cmd [ args ] ] screen -r [[pid.]tty[.host]] screen -r sessionowner/[[pid.]tty[.host]]

supervisor

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

原理: 通过 fork/exec 的方式把被管理的进程当作 supervisor 的子进程来启动,这样只要在 supervisor 的配置文件中,把要管理的进程的可执行文件的路径写进去即可。

当子进程挂掉时,父进程可以准确获取子进程挂掉的信息,可以选择是否自己启动和报警;
还可以为 supervisord 或者每个子进程,设置一个非 root 的 user,这个 user 就可以管理它对应的进程。

检查安装

提醒: Supervisor 官方版目前只能运行在 Python 2.4 以上版本,但是还无法运行在 Python 3 上,不过已经有一个 Python 3 的移植版 supervisor-py3k

CentOS/RedHat/Fedora

sudo yum -y install supervisor

Ubuntu/Debian

sudo apt-get -y install supervisor

pip 安装

pip install supervisor

配置文件

supervisor 配置文件:/etc/supervisor/supervisord.conf
注:supervisor 的配置文件默认是不全的,不过在大部分默认的情况下,上面说的基本功能已经满足。

子进程配置文件路径:/etc/supervisord.d/
注:默认子进程配置文件为 ini 格式,可在 supervisor 主配置文件中修改。

本人服务器的文件目录/etc/supervisord.conf

supervisor.conf 配置文件说明:

[unix_http_server] file=/tmp/supervisor.sock ;UNIX socket 文件,supervisorctl 会使用 ;chmod=0700 ;socket文件的mode,默认是0700 ;chown=nobody:nogroup ;socket文件的owner,格式:uid:gid ;[inet_http_server] ;HTTP服务器,提供web管理界面 ;port=127.0.0.1:9001 ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性 ;username=user ;登录管理后台的用户名 ;password=123 ;登录管理后台的密码 [supervisord] logfile=/tmp/supervisord.log ;日志文件,默认是 $CWD/supervisord.log logfile_maxbytes=50MB ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小 logfile_backups=10 ;日志文件保留备份数量默认10,设为0表示不备份 loglevel=info ;日志级别,默认info,其它: debug,warn,trace pidfile=/tmp/supervisord.pid ;pid 文件 nodaemon=false ;是否在前台启动,默认是false,即以 daemon 的方式启动 minfds=1024 ;可以打开的文件描述符的最小值,默认 1024 minprocs=200 ;可以打开的进程数的最小值,默认 200 [supervisorctl] serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致 ;serverurl=http://127.0.0.1:9001 ; 通过HTTP的方式连接supervisord ; [program:xx]是被管理的进程配置参数,xx是进程的名称 [program:xx] command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run ; 程序启动命令 autostart=true ; 在supervisord启动的时候也自动启动 startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒 autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启 startretries=3 ; 启动失败自动重试次数,默认是3 user=tomcat ; 用哪个用户启动进程,默认是root priority=999 ; 进程启动优先级,默认999,值小的优先启动 redirect_stderr=true ; 把stderr重定向到stdout,默认false stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10 ; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件) stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程 killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程 ;包含其它配置文件 [include] files = relative/directory/*.ini ;可以指定一个或多个以.ini结束的配置文件

子进程配置文件说明:
给需要管理的子进程(程序)编写一个配置文件,放在 /etc/supervisor.d/ 目录下,以 .ini 结尾,此处新建 blog.ini
参数见上面的 supervisor.conf 配置文件说明

#redis数据定时插入数据库 [program:dbtimer] directory=/home/www/blog command=php index.php swoole/cron/index autostart=true autorestart=true stderr_logfile=/home/www/blog/timerin.log stdout_logfile=/home/www/blog/timerout.log #swoole启动 [program:swoolerun] directory=/home/www/blog command=php swooleRun.php autostart=true autorestart=true stderr_logfile=/home/www/blog/swoolein.log stdout_logfile=/home/www/blog/swooleout.log

基本使用

supervisor 启动

// 启动supervisor并加载默认配置文件 sudo systemctl start supervisord.service //将supervisor加入开机启动项 sudo systemctl enable supervisord.service

常用命令

supervisorctl status // 查看所有进程的状态 supervisorctl update // 配置文件修改后使用该命令加载新的配置 supervisorctl reload // 重新启动配置中的所有程序 supervisorctl restart <application name> // 重启指定应用 supervisorctl stop <application name> // 停止指定应用 supervisorctl start <application name> // 启动指定应用

注:<application name> 换成 all 可以管理配置中的所有进程。直接输入 supervisorctl 进入 supervisorctl 的 shell 交互界面,此时上面的命令不带 supervisorctl 可直接使用

  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    952 引用 • 944 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...