站内公告:

我们的虚拟社区正式开通了

Main Menu

最新帖子

#1
func ContainsString(src []string, dest string) bool {
    for _, item := range src {
        if item == dest {
            return true
        }
    }
    return false
}

// DifferenceStrings 取前者src与后者dest两个字符串列表的差集
func DifferenceStrings(src []string, dest []string) []string {
    res := make([]string, 0)
    for _, item := range src {
        if !ContainsString(dest, item) {
            res = append(res, item)
        }
    }
    return res
}

// IntersectionStrings 取两个字符串列表的交集
func IntersectionStrings(src []string, dest []string) []string {
    res := make([]string, 0)
    for _, item := range src {
        if ContainsString(dest, item) {
            res = append(res, item)
        }
    }
    return res
}

// UnionString 取两个字符串列表的并集
func UnionStrings(src []string, dest []string) []string {
    res := make([]string, 0)
    res = append(res, src...)
    for _, item := range dest {
        if !ContainsString(res, item) {
            res = append(res, item)
        }
    }
    return res
}
#2
Go 开发 / golang time.Now() 格式化的问题
最后发布 jvip_chen - 2022-08-23 04:26 下午
golang中使用time.Now().Format("2006/1/2 15:04:05") 格式化时间输出时,Format的参数必须是"2006/1/2 15:04:05",这个时间为例的时间格式吗?

func main() {
    now := time.Now()

    fmt.Println(now)

    // 必须使用这个时间才能返回正确的格式化后的时间,其他的都不行

    fmt.Println(now.Format("2006/1/2 15:04:05"))

    fmt.Println(now.Format("2006/01/02 15:04:05"))

    fmt.Println(now.Format("15:04:05 2006/1/2"))

    fmt.Println(now.Format("2006/1/2"))

}
#3
Go 开发 / Go Pkg不同系统交叉编译
最后发布 jvip_chen - 2022-08-23 02:06 下午
Golang 支持交叉编译,即在一个平台编译,在另一个平台运行,本文介绍Golang Pkg不同系统交叉编译。

参数说明
GOOS: 目标平台
  • mac : darwin
  • linux : linux
  • windows : windows
GOARCH :目标平台的体系架构
  • 386 也称 x86 : 32位操作系统
  • amd64 也称 x64 : 64位操作系统,比如电脑一般都是amd64架构的
  • arm 一般用于嵌入式开发,比如Android,IOS,Win mobile等
交叉编译不支持CGO_ENABLED,使用CGO_ENABLED=0设置。
编译命令
编译在Linux运行的包
CGO_ENABLED=0  GOOS=linux  GOARCH=amd64  go  build
编译在Windows运行的包
CGO_ENABLED=0  GOOS=windows  GOARCH=amd64  go  build
编译在Mac运行的包
CGO_ENABLED=0  GOOS=darwin  GOARCH=amd64  go  build
其他说明
若是在windows编译,需要采用如下命令设置变量:
SET CGO_ENABLED=0
SET GOOS=darwin
SET GOARCH=amd64
go build
#4
Go 开发 / Go语言中字符串简介
最后发布 jvip_chen - 2022-08-23 01:56 下午
关键词
通过下面几个问题,去理解,记忆:

字符串的特性

Go语言中字符串占几个字符

如何定义一个字符串,每种方式 有什么缺点

是否可以获取字符串中某个元素的地址呢?

字符串拼接时,+ 号必须在每一行的末尾

1、什么是字符串
一个字符串是一个不可改变的字节序列,字符串可以包含任意的数据,但是通常是用来包含可读的文本,

2、字符串有什么特性?
字符串是一种值类型,且值不可变,

即创建某个文本后将无法再次修改这个文本的内容,更深入地讲,字符串是字节的定长数组。

3、Go语言中字符串占多少个字节
在Go语言中,字符串可能根据需要占用1到4个字节

字符串是 UTF-8 字符的一个序列(当字符为 ASCII 码表上的字符时则占用 1 个字节,其它字符根据需要占用 2-4 个字节)。

4、如何定义一个字符串呢?
双引号""
缺点:这种定义方式不能跨行定义字符串,得使用反引号方式
反引号``
多使用于 定义 多行字符串的场景
缺点:反引号内的转义字符 全部无效,换行可以做为字符串的换行输出
4.1、使用双引号定义字符串
可以使用双引号""来定义字符串,字符串中可以使用转义字符来实现换行、缩进等效果,常用的转义字符包括:

\n:换行符
\r:回车符
\t:tab 键
\u 或 \U:Unicode 字符
\:反斜杠自身
package main

import (
    "fmt"
)

func main() {
    var str = "C语言中文网\nGo语言教程"
    fmt.Println(str)
}
运行结果为:

C语言中文网
Go语言教程
4.2、使用反引号定义字符串
如果想要在源码中嵌入一个多行字符串时,就必须使用`反引号,代码如下:

const str = `第一行
第二行
第三行
\r\n
`
fmt.Println(str)
代码运行结果:

第一行
第二行
第三行
\r\n
反引号`,是键盘上 1 键左边的键,两个反引号间的字符串将被原样赋值到 str 变量中。

注意:
在这种方式下,反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。

5、字符串的比较运算符
一般的比较运算符(==、!=、<、<=、>=、>)是通过在内存中按字节比较来实现字符串比较的,因此比较的结果是字符串自然编码的顺序。

字符串所占的字节长度可以通过函数 len() 来获取,例如 len(str)。

字符串的内容(纯字节)可以通过标准索引法来获取,在方括号[ ]内写入索引,索引从 0 开始计数:
字符串 str 的第 1 个字节:str[0]
第 i 个字节:str[i - 1]
最后 1 个字节:str[len(str)-1]

需要注意的是,这种转换方案只对纯 ASCII 码的字符串有效。

注意:
获取字符串中某个字节的地址属于非法行为,例如 &str

6、字符串拼接
直接使用+号,拼接在一起
使用+=符合,进行拼接
两个字符串 s1 和 s2 可以通过 s := s1 + s2 拼接在一起。

将 s2 追加到 s1 尾部并生成一个新的字符串 s。

可以通过下面的方式来对代码中多行的字符串进行拼接:

Go语言中字符串拼接方式.png
提示:
因为编译器会在行尾自动补全分号,所以拼接字符串用的加号"+"必须放在第一行末尾。

也可以使用"+="来对字符串进行拼接:


s := "hel" + "lo,"
s += "world!"
fmt.Println(s) //输出 "hello, world!"
#5
Rocky / Rocky Linux 8无缝升级Rocky Linux 9...
最后发布 jvip_chen - 2022-08-23 07:16 上午
重要:升级前请做好数据备份以及重要配置备份!!!

升级前确保磁盘空间足够,大约需要空闲磁盘5G

清除原有的yum,epel源等

dnf -y remove rpmconf yum-utils epel-release  2. 安装最新系统的重要三个内核文件,选取自己系统适合的内核文件(Centos自行在官方的BaseOS查找)
#Rocky Linux 8 _x64
dnf -y install https://os.iso.st/r9/minimal/Packages/rocky-release-9.0-2.1.el9.noarch.rpm https://os.iso.st/r9/minimal/Packages/rocky-repos-9.0-2.1.el9.noarch.rpm https://os.iso.st/r9/minimal/Packages/rocky-gpg-keys-9.0-2.1.el9.noarch.rpm
#Rocky Linux 8 _aarch64
dnf -y install https://os.iso.st/r9arch/minimal/Packages/rocky-release-9.0-2.1.el9.noarch.rpm https://os.iso.st/r9arch/minimal/Packages/rocky-repos-9.0-2.1.el9.noarch.rpm https://os.iso.st/r9arch/minimal/Packages/rocky-gpg-keys-9.0-2.1.el9.noarch.rpm
显示下图即可进行下一步

You cannot see attachments on this board.

  3. 升级Rocky Linux 8 (注意centos stream9 --releaserver=9-stream)

dnf -y --releasever=9 --allowerasing --setopt=deltarpm=false distro-sync
等待时间根据网络情况或许很久,请耐心等待;

下载结束后可能会出现以下两个错误,需进行处理,其他错误自行参考解决,或者留言进行辅助解决

  ①:file  /usr/share/redhat-logos  ... el8  ...el9 类似的长文。此错误表示原有的文件和el9不兼容,删除该目录即可,稍后会自动生成创建

rm -rf /usr/share/redhat-logos
  ②:file ... epel-rpm-macros-systemd.el8    .... el9  类似的长文,等同上述,存在兼容问题,卸载稍后重装即可

dnf remove -y epel-rpm-macros-systemd
  此处根据CPU性能,可能会等待许久。等待结束即表示升级成功。

You cannot see attachments on this board.

升级成功后,卸载已存在旧的内核。需要先查看最新内核是否已经安装;

  4. 查看已存在的内核,最新的内核应该为5.x

rpm -qa | grep kernel
输出如下:

[root@sp ~]# rpm -qa | grep kernel
警告:Found bdb_ro Packages database while attempting sqlite backend: using bdb_ro backend.
kernel-tools-libs-5.14.0-70.13.1.el9_0.x86_64
kernel-srpm-macros-1.0-11.el9.noarch
kernel-headers-5.14.0-70.13.1.el9_0.x86_64
kernel-modules-5.14.0-70.13.1.el9_0.x86_64
kernel-modules-4.18.0-372.13.1.el8_6.x86_64
kernel-core-4.18.0-372.16.1.el8_6.x86_64
kernel-core-4.18.0-372.13.1.el8_6.x86_64
kernel-4.18.0-372.16.1.el8_6.x86_64
kernel-4.18.0-372.13.1.el8_6.x86_64
kernel-devel-4.18.0-372.16.1.el8_6.x86_64
kernel-5.14.0-70.13.1.el9_0.x86_64
kernel-tools-5.14.0-70.13.1.el9_0.x86_64
kernel-modules-4.18.0-372.16.1.el8_6.x86_64
kernel-core-5.14.0-70.13.1.el9_0.x86_64
kernel-devel-5.14.0-70.13.1.el9_0.x86_64
kernel-devel-4.18.0-372.13.1.el8_6.x86_64
上面出现警告,我们需要重建rpm仓库

cd /var/lib/rpm
rm -f __db.00*
rpm --rebuilddb
重新运行即可正常;对于输出存在5.x内核的,直接卸载旧内核

rpm -e --nodeps `rpm -qa|grep -i kernel|grep 4.18`
如果没有5.x内核,进行内核安装在卸载即可

dnf -y install kernel kernel-core shim
  5. 此时有人注意到执行dnf命令时,会有如下报错

上次元数据过期检查:0:11:03 前,执行于 2022年07月18日 星期一 09时45分49秒。
模块依赖问题:

问题 1: 冲突的请求
  - 没有东西提供 module(platform:el8)(模块 perl:5.26:8050020211109115414:b4937e53.x86_64 需要它)
问题 2: 冲突的请求
  - 没有东西提供 module(platform:el8)(模块 perl-IO-Socket-SSL:2.066:8060020220513050719:bc93984d.x86_64 需要它)
问题 3: 冲突的请求
  - 没有东西提供 module(platform:el8)(模块 perl-libwww-perl:6.34:8060020220513153220:9168a43d.x86_64 需要它)
问题 4: 冲突的请求
  - 没有东西提供 module(platform:el8)(模块 python36:3.6:8050020211109130820:982725ab.x86_64 需要它)
依赖关系解决。
无需任何处理。
完毕!
不要担心,因为这些插件都已经升级最新版本的el9了,内核这种也没有这种模块了,我们将它禁用即可(禁用后重启会自动删除这些不存在的模块)

禁用时记得带着版本,不然会出问题,当然可能不止以上

dnf module disable perl:5.26 perl-IO-Socket-SSL:2.066 perl-libwww-perl:6.34 python36:3.6
再次执行dnf即可正常

至此系统升级完毕,重启使最新内核生效即可

dnf update -y
reboot
#6
Rocky / CentOS 8迁移到Rocky Linux 8.5的方法步...
最后发布 jvip_chen - 2022-08-23 07:12 上午
日前Rocky Linux 8.5版本已正式发布,用户可以按需进行下载使用。因为CentOS 8到年底将停止维护,所以这时选择把CentOS 8服务器迁移到Rocky Linux(二进制代码与CentOS和RHEL兼容),将会是不错的选择。那么CentOS 8如何迁移到Rocky Linux呢?下面来看下主要步骤介绍。

1、 更新/升级当前的CentOS系统 值得注意的是,在运行以下迁移命令之前,您需要将CentOS系统中的所有重要数据进行备份。进入到您的 CentOS,升级系统,以确保所有软件包准备就绪。

sudo dnf –y upgrade
升级完成后,重新启动系统以确保变更生效,包括与内核相关的变更。

sudo reboot
2、获取migrate2rocky转换脚本 Rocky Linux 提供了一个名为migrate2rocky的工具,该工具已在许多RHEL变体版本(比如CentOS、Alma Linux和Oracle Linux)上成功地测试。migrate2rocky脚本可用于轻松地就地迁移到 Rocky Linux。

(1)下载脚本。

curl -O https://raw.githubusercontent.com/rocky-linux/rocky-tools/main/migrate2rocky/migrate2rocky.sh
(2)使脚本可执行。

chmod +x migrate2rocky.sh
3、开始从CentOS迁移到Rocky Linux的过程

最后,使用本地可用的脚本,用-r选项运行,以便从CentOS 8迁移到Rocky Linux 8。

sudo bash migrate2rocky.sh –r
Preparing to migrate CentOS Linux 8 to Rocky Linux 8. Determining repository names for CentOS Linux 8.... Found the following repositories which map from CentOS Linux 8 to Rocky Linux 8: CentOS Linux 8 Rocky Linux 8 appstream appstream baseos baseos extras extras
该脚本会自动将CentOS 8 Linux代码存储库更改为Rocky Linux代码存储库。耐心等待,因为升级过程可能需要一些时间。

一旦迁移完成,您将看到:

Done, please reboot your system. A log of this installation can be found at /var/log/migrate2rocky.log
运行以下命令以同步已安装的软件包,然后只需重新启动系统。
 

sudo dnf distro-sync -y
 
sudo reboot
4、 检查操作系统版本 为了确认您已成功迁移到Rocky Linux,请检查操作系统版本。

cat /etc/redhat-release
Rocky Linux release 8.5 (Green Obsidian)

恭喜您已成功将CentOS Linux 8迁移到了Rocky Linux 8.5。
#7
Arch / pacman命令
最后发布 jvip_chen - 2022-08-17 05:02 下午
pacman软件包管理器是 Arch Linux 的一大亮点。它将一个简单的二进制包格式和易用的构建系统结合了起来。pacman的目标是简化对软件包的管理,无论软件包是来自官方软件仓库还是来自用户自己的创建。

pacman 通过和主服务器同步软件包列表来进行系统更新。这种服务器/客户端模式可在使用一条命令就下载或安装软件包的同时,也安装其必需的依赖包。

pacman 用 C 语言编写,使用bsdtar(1)tar作为打包格式。

pacman的详细使用可参考:https://man.archlinux.org/man/pacman.8https://wiki.archlinux.org/title/Pacman_(简体中文)

下面列出pacman的常用命令:(够一般人平常使用,有其他需求可查询官方文档)

核心命令

sudo pacman -Syu :进行全面系统更新(即通俗意义的"滚")

sudo pacman -Sy: 刷新本地镜像源

sudo pacman -Syy : 强制刷新本地镜像源

安装软件

sudo pacman -S packagename : 安装指定软件

sudo pacman -Sy packagename : 刷新数据库后安装指定软件

sudo pacman -Sv packagename : 显示一些操作信息后安装指定软件

sudo pacman -U pkg.tar.xz :安装本地包

sudo pacman -U link.tar.xz :安装远程包

删除软件

sudo pacman -R packagename :删除指定软件,保留其全部已经安装的依赖关系

sudo pacman -Rs packagename :删除指定软件,并删除仅与该软件存在依赖关系的其他软件

sudo pacman -Rsc packagename :删除指定软件,并删除所有与该软件存在依赖关系的其他软件

sudo pacman -Rd packagename :删除指定软件,不检查依赖

搜索软件

sudo pacman -Ss keyword:在仓库中搜索含关键字的软件

sudo pacman -Qs keyword:在已安装软件中搜索含关键词的软件

sudo pacman -Qi packagename:搜索指定软件的详细信息

sudo pacman -Ql packagename:列出指定软件的文件

其他命令

sudo pacman -Sw packagename:只下载指定软件而不安装

sudo pacman -Sc :清理未安装的软件包

sudo pacman -Scc :清理所有的缓存文件
#8
PHP 开发 / PHP怎么守护进程运行php脚本
最后发布 jvip_chen - 2022-08-16 08:25 上午
一、使用php代码来实现守护进程

需要用到pcntl扩展,可以通过php -m命令查看是否已安装pcntl扩展。

如果安装了pcntl扩展,但是pcntl函数被禁用的话,也是无法使用的。需要在php.ini中去掉,打开"php.ini"配置文件;然后查找字符"disable_functions",将pcntl开头的函数删掉。

新建一个Daemon.php,代码如下:
<?php
 
class Daemon {
    private 
$pidfile;
 
    function 
__construct() {
        
$this->pidfile dirname(__FILE__).'/daemontest.pid';
    }
 
    private function 
startDeamon() {
        if (
file_exists($this->pidfile)) {
            echo 
"The file $this->pidfile exists.\n";
            exit();
       }
   
       
$pid pcntl_fork();
       if (
$pid == -1) {
            
//这里是创建进程失败
            
die('could not fork');
       } else if (
$pid) {
           
//这里是父进程
           
echo 'start ok';
           exit(
$pid);
       } else {
           
//这里是子进程
           
file_put_contents($this->pidfilegetmypid());
           return 
getmypid();
        }
    }
 
    private function 
start(){
        
$pid $this->startDeamon();
        while (
true) {
            
//在这里写你的业务代码,比如每隔1秒钟,往当前目录下的test.txt文件里面添加当前时间
            
file_put_contents(dirname(__FILE__).'/test.txt'date('Y-m-d H:i:s'), FILE_APPEND);
            
sleep(1);
        }
    }
 
    private function 
stop(){
        if (
file_exists($this->pidfile)) {
           
$pid file_get_contents($this->pidfile);
           
posix_kill($pid9);
           
unlink($this->pidfile);
        }
    }
   
 
    public function 
run($argv) {
        if(
$argv[1] == 'start') {
            
$this->start();
        }else if(
$argv[1] == 'stop') {
            
$this->stop();
        }else if(
$argv[1] == 'restart'){
            
$this->stop();
            
$this->start();
        }else{
            echo 
'param error';
        }
    }
 
}
 
$deamon = new Daemon();
$deamon->run($argv);
启动:

php Daemon.php start
停止:

php Daemon.php stop
重启:

php Daemon.php restart
二、使用linux命令来实现守护进程

除了上面那种使用php代码来实现守护进程,我们还可以通过linux命令来实现

新建一个test.php,代码如下:

<?php
while(true){
    
//在这里写你的业务代码,比如每隔1秒钟,往当前目录下的test.txt文件里面添加当前时间
    
file_put_contents(dirname(__FILE__).'/test.txt'date('Y-m-d H:i:s'), FILE_APPEND);
    
sleep(1);
}
普通运行方式:

php test.php
守护进程运行方式:

//nohup表示不挂断地运行命令,&表示在后台运行,两个结合起来使用就可以守护进程运行
nohup php test.php &
查看进程端口:

netstat -lnpt
杀死进程:

kill -9 pid
我们通过nohup命令和&结合,就可以实现守护进程运行php脚本了,非常方便。
#9
python3 开发 / python PIL/cv2/base64相互转换 转载
最后发布 jvip_chen - 2022-08-01 02:49 下午
PIL和cv2是python中两个常用的图像处理库,PIL一般是anaconda自带的,cv2是opencv的python版本。base64在网络传输图片的时候经常用到。

##PIL读取、保存图片方法

from PIL import Image
img = Image.open(img_path)
img.save(img_path2)

##cv2读取、保存图片方法

import cv2
img = cv2.imread(img_path)
cv2.imwrite(img_path2, img)

##图片文件打开为base64

import base64

def img_base64(img_path):
with open(img_path,"rb") as f:
base64_str = base64.b64encode(f.read())
return base64_str 

1、PIL和cv2转换

##PIL转cv2

import cv2
from PIL import Image
import numpy as np

def pil_cv2(img_path):
image = Image.open(img_path)
img = cv2.cvtColor(np.asarray(image),cv2.COLOR_RGB2BGR)
return img 
 

##cv2转PIL

import cv2
from PIL import Image

def cv2_pil(img_path):
image = cv2.imread(img_path)
image = Image.fromarray(cv2.cvtColor(image,cv2.COLOR_BGR2RGB))
return image

2、PIL和base64转换

##PIL转base64

import base64
from io import BytesIO

def pil_base64(image):
img_buffer = BytesIO()
image.save(img_buffer, format='JPEG')
byte_data = img_buffer.getvalue()
base64_str = base64.b64encode(byte_data)
return base64_str

##base64转PIL

import base64
from io import BytesIO
from PIL import Image

def base64_pil(base64_str):
image = base64.b64decode(base64_str)
image = BytesIO(image)
image = Image.open(image)
return image 

3、cv2和base64转换

##cv2转base64

import cv2

def cv2_base64(image):
base64_str = cv2.imencode('.jpg',image)[1].tostring()
base64_str = base64.b64encode(base64_str)
return base64_str 

##base64转cv2

import base64
import numpy as np
import cv2

def base64_cv2(base64_str):
imgString = base64.b64decode(base64_str)
nparr = np.fromstring(imgString,np.uint8)
image = cv2.imdecode(nparr,cv2.IMREAD_COLOR)
return image
#10
在工作中,会发现gunicorn启动的web服务,无论怎么使用kill -9 进程号都是无法杀死gunicorn,经过我一番百度和谷歌,发现想要删除gunicorn进程其实很简单。

1. 寻找masterpid
通过执行如下命令,可以获取Gunicorn进程树:
pstree -ap|grep gunicorn
得到如下的结果。

|-grep,6194 --col gunicorn
  |   `-gunicorn,30080 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,4413 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,8030 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,8135 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,8137 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,11532 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,13460 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,19728 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,23585 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,23825 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,27921 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,28899 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,28900 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,28901 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,35637 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,36963 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,43074 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,43118 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,43232 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,43307 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,43308 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,44018 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,46996 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       |-gunicorn,47000 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
  |       `-gunicorn,47650 /usr/local/bin/gunicorn collect:app -c collect_gunicorn.py
很显然,30080就是Gunicorn的主进程。

2. 重启Gunicorn任务
按照官方的推荐方法,很容易执行命令:

kill -HUP 30080
执行上述命令后,再次执行"pstree -ap|grep gunicorn",我们很容易发现,除了主进程,其他的Gunicorn进程都已经销毁,并新建了进程(进程ID发生了变化)。

3. 退出Gunicorn任务
kill -9 30080或者
killall -9 gunicorn