站内公告:

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

Main Menu

最新帖子

#31
Linux 系统 / linux中iptables如何删除一条规则
上次发布者 jvip_chen - 2022-11月-16 10:28 下午
linux中iptables删除一条规则的方法:
1、打开linux终端;
2、在终端命令行中输入"iptables -L -n"命令查看出当前的防火墙规则;
3、输入"iptables -L -n --line-number"命令查看到每个规则chain的序列号;
4、根据序列号删除指定一条防火墙则即可。


具体操作步骤:

1、在linux系统桌面中使用快捷键【Ctrl+Alt+T】打开linux终端命令行模式。

2、在linux终端命令行中输入以下命令查看出当前的防火墙规则。

iptables -L -n
3、输入以下命令查看到每个规则chain的序列号。

iptables -L -n --line-number
4、最后输入以下命令根据序列号删除指定一条防火墙规则即可。

iptables -D INPUT 3 #删除INPUT的第三条已添加规则,这里3代表第几行规则
相关操作命令:

#iptables防火墙
service iptables status  #查看iptables防火墙状态
service iptables start   #开启防火墙
service iptables stop    #停止防火墙
#firewall防火墙
systemctl status firewalld #查看firewall防火墙服务状态
service firewalld start #开启防火墙
service firewalld stop #关闭防火墙
#32
代码管理-Git / git merge后,想恢复之前版本步骤
上次发布者 jvip_chen - 2022-11月-03 02:26 下午
一共需要三个步骤:

第一步:git checkout到你想恢复的分支上

1.git checkout 分支名
第二步:git reflog查出要回退到merge之前的版本号

 git reflog
└──╼$git reflog
a88a5c89 (HEAD -> channel/pre) HEAD@{0}: pull: Merge made by the 'ort' strategy.
cf889952 (dev/swipe_auto) HEAD@{1}: reset: moving to cf889952
cf889952 (dev/swipe_auto) HEAD@{2}: reset: moving to cf889952
3e5a2166 HEAD@{3}: merge dev/swipe_auto: Merge made by the 'ort' strategy.
3a4a5248 HEAD@{4}: checkout: moving from dev/swipe_auto to channel/pre
cf889952 (dev/swipe_auto) HEAD@{5}: commit: 优化sql
8517922d HEAD@{6}: checkout: moving from channel/qa to dev/swipe_auto
81fcf05d (channel/qa) HEAD@{7}: merge dev/swipe_auto: Merge made by the 'ort' strategy.
7c8f5fda HEAD@{8}: pull: Fast-forward
a02ee7cd HEAD@{9}: checkout: moving from dev/swipe_auto to channel/qa
     

第三步:git reset --hard 版本号,就可以回到merge之前的代码状态了

git reset --hard a1d566d
└──╼$git reset --hard 524763dc0c96249cd207956d59ad6d1f07a6a1de
HEAD is now at 524763dc 增加二次打印
    成功了

   
#33
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
}
#34
Go 开发 / golang time.Now() 格式化的问题
上次发布者 jvip_chen - 2022-8月-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"))

}
#35
Go 开发 / Go Pkg不同系统交叉编译
上次发布者 jvip_chen - 2022-8月-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
#36
Go 开发 / Go语言中字符串简介
上次发布者 jvip_chen - 2022-8月-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!"
#37
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
#38
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。
#39
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 :清理所有的缓存文件
#40
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脚本了,非常方便。