站内公告:

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

Main Menu

最新帖子

#31
Rocky / Rocky Linux 8无缝升级Rocky Linux 9...
上次发布者 jvip_chen - 2022-8月-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 view this attachment.

  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 view this attachment.

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

  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
#32
Rocky / CentOS 8迁移到Rocky Linux 8.5的方法步...
上次发布者 jvip_chen - 2022-8月-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。
#33
Arch / pacman命令
上次发布者 jvip_chen - 2022-8月-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 :清理所有的缓存文件
#34
PHP 开发 / PHP怎么守护进程运行php脚本
上次发布者 jvip_chen - 2022-8月-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脚本了,非常方便。
#35
python3 开发 / python PIL/cv2/base64相互转换 转载
上次发布者 jvip_chen - 2022-8月-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
#36
python3 开发 / 如何优雅的退出/关闭/重启gunicorn进程
上次发布者 jvip_chen - 2022-6月-27 02:35 下午
在工作中,会发现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
#37
代码管理-Git / git-忽略已提交的文件或目录
上次发布者 jvip_chen - 2022-6月-24 09:09 上午
1.先把项目备份,以防万一。

2.从版本库中rm文件或目录

rm文件

git rm --cached file_name //从版本库中rm文件,working dicrectory中仍然保留(本地文件还存在, 只是不希望这个文件被版本控制。)
rm目录

git rm -r --cached directory_name //删除目录下所有文件包括子目录
3.在.gitignore中添加要忽略的文件

4.把修改的文件commit并且push到服务端

5.从git上重新拉取这个项目。
#38
Redis数据库 / python 连接 redis cluster 集群
上次发布者 jvip_chen - 2022-6月-21 09:52 下午
一. redis集群模式有多种, cluster模式只是其中的一种实现方式, 其原理请自行谷歌或者百度, 这里只举例如何使用Python操作 redis cluster 集群

二. python 连接 redis cluster 集群

  第三方库:

    redis-py-cluster: 最近还在维护

    rediscluster: 似乎很久没有更新了

pip install redis-py-cluster
or
pip install rediscluster
from rediscluster import StrictRedisCluster

# redis cluster 集群最少三主三从
startup_nodes = [
    {"host":"192.168.3.25", "port":6379},  # 主
    {"host":"192.168.3.25", "port":7001},  # 6379的从数据库
    {"host":"192.168.3.25", "port":6380},  # 主
    {"host":"192.168.3.25", "port":7002},  # 6380的从数据库
    {"host":"192.168.3.25", "port":6381},  # 主
    {"host":"192.168.3.25", "port":7003}   # 6381的从数据库
]

# 连接集群
conn = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)

conn.set('name', 'lowman')
conn.set('kind', '屌丝')
conn.set('money', '3块8')

print("My name is: ", conn.get('name'))
print "I have money: ", conn.get('money')
其他的各项操作方法与 python 的 redis 库保持一致. startup_nodes 参数中即使存在 错误节点参数 也能连接成功: 理论上, 只要保证有一个节点参数正确就可以正常连接
#39
Linux 系统 / ssh 免 yes
上次发布者 jvip_chen - 2022-6月-16 08:44 下午
1. 使用ssh连接远程主机时加上"-o StrictHostKeyChecking=no"的选项,如下:(推荐!!!)

做法是使用-o 这个参数,在ssh/scp里加上 -o "StrictHostKeyChecking no" 即可跳过这个yes/no询问,直接进入下一步,例:

Use the -o option:

scp -o "StrictHostKeyChecking no" 1.txt user@host:1.txt

ssh -o "StrictHostKeyChecking no" user@host

2. 一个彻底去掉这个提示的方法是,修改/etc/ssh/ssh_config文件(或$HOME/.ssh/config)中的配置,添加如下两行配置:

一般为:StrictHostKeyChecking ask

可改为:StrictHostKeyChecking no

UserKnownHostsFile /dev/null

修改好配置后,重新启动sshd服务即可,命令为:/etc/init.d/sshd restart (或 service sshd restart )

当然,这是内网中非常信任的服务器之间的ssh连接,所以不考虑安全问题,就直接去掉了主机密钥(host key)的检查。

ssh中遇到的"Host key verification failed."问题,也是和"StrictHostKeyChecking"配置有关。

上面就是Linux去除ssh连接时The authenticity of host can't be xx established 提示的方法介绍了,如果你觉得该提示一直出现很烦的话,可选择去掉。

#40
数据库管理工具 / DBeaver笔记-快捷键篇
上次发布者 virtual - 2022-5月-25 10:11 下午
DBeaver 是一个通用的数据库管理工具和 SQL 客户端,支持 MySQL, PostgreSQL, Oracle, DB2, MSSQL, Sybase, Mimer, HSQLDB, Derby, 以及其他兼容 JDBC 的数据库。

DBeaver 提供一个图形界面用来查看数据库结构、执行 SQL 查询和脚本,浏览和导出数据,处理 BLOB/CLOB 数据,修改数据库结构等等。

hot key
ctrl + enter 执行sql
ctrl + shift + ↑ 向上复制一行
ctrl + shift + ↓ 向下复制一行
ctrl + alt + F 对sql语句进行格式化,对于很长的sql语句很有用
ctrl + d 删除当前行
alt + ↑ 向上选定一条sql语句
alt + ↓ 向下选定一条sql语句
ctrl + / 行注释
ctrl + shift+ / 块注释
ctrl + f 查找、替换
ctrl + space sql提示(如果写了from table后也会自动提示field)
ctrl + shift + E 执行计划
ctrl + shift + U 将选定的sql转换成大写字母
ctrl + shift + L 将选定的sql转换成小写字母
小技巧
有一些快捷键在使用时,只需要将光标移动到某一条sql语句上就行,不需要选定整条完整的语句。
有一些快捷键使用时是默认对当前一整个 Script 页面生效,可以通过光标来选定只想生效的范围。