Linux 后台进程

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

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 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    946 引用 • 943 回帖

相关帖子

欢迎来到这里!

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

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