Centos7 升级openssh8.3

参考

通过虚拟机下载提取安装包(有的机房禁止访问外网)

yum install --downloadonly --downloaddir=rpm gcc gcc-c++ glibc make autoconf openssl openssl-devel pcre-devel  pam-devel krb5-devel
cd rpm

rpm -ivh autoconf-2.69-11.el7.noarch.rpm cpp-4.8.5-39.el7.x86_64.rpm gcc-4.8.5-39.el7.x86_64.rpm gcc-c++-4.8.5-39.el7.x86_64.rpm glibc-devel-2.17-307.el7.1.x86_64.rpm glibc-headers-2.17-307.el7.1.x86_64.rpm kernel-headers-3.10.0-1127.18.2.el7.x86_64.rpm keyutils-libs-devel-1.5.8-3.el7.x86_64.rpm libcom_err-devel-1.42.9-17.el7.x86_64.rpm libkadm5-1.15.1-46.el7.x86_64.rpm libselinux-devel-2.5-15.el7.x86_64.rpm libsepol-devel-2.5-10.el7.x86_64.rpm libstdc++-devel-4.8.5-39.el7.x86_64.rpm libverto-devel-0.2.5-4.el7.x86_64.rpm m4-1.4.16-10.el7.x86_64.rpm openssl-devel-1.0.2k-19.el7.x86_64.rpm pam-devel-1.1.8-23.el7.x86_64.rpm pcre-devel-8.32-17.el7.x86_64.rpm zlib-devel-1.2.7-18.el7.x86_64.rpm krb5-devel-1.15.1-46.el7.x86_64.rpm

下载openssh8.3p1 和 openssl-1.1.9.tar.gz

wget -c https://ftp.openssl.org/source/openssl-1.1.1g.tar.gz

wget -c https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/openssh-8.3.tar.gz

解压并编译安装openssl

openssl version #查看当前版本,等升级完对比
OpenSSL 1.0.2k-fips  26 Jan 2017

mv /usr/bin/openssl /usr/bin/openssl_bak #备份
mv /usr/include/openssl /usr/include/openssl_bak #备份

tar -zxvf openssl-1.1.1g.tar.g
cd openssl-1.1.1g/
./config --prefix=/usr/local/ssl -d shared && make && make install

echo $?  #echo $?查看下最后的make install是否有报错,0表示没有问题
0

ln -s /usr/local/ssl/bin/openssl /usr/bin/openssl  #生成软链接
ln -s /usr/local/ssl/include/openssl /usr/include/openssl  #生成软链接

ll /usr/bin/openssl #查看是否生成成功
/usr/bin/openssl -> /usr/local/ssl/bin/openssl

ll /usr/include/openssl -ld #查看是否生成成功
/usr/include/openssl -> /usr/local/ssl/include/openssl

#执行下面命令加载配置
echo "/usr/local/ssl/lib" >> /etc/ld.so.conf
/sbin/ldconfig

openssl version #查看确认版本

如果出现openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

#查找libssl.so.1.1的目录 然后生成软链接
find / -name "libssl.so.1.1"
/usr/local/lib64/libssl.so.1.1

ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1  /usr/lib64/libcrypto.so.1.1

解压并安装openssh

ssh -V #查看ssh版本
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017

tar -zxvf openssh-8.3p1.tar.gz
cd openssh-8.3p1
chown -R root.root /root/openssh/openssh-8.3p1 #更改当前目录所属用户和用户组为root

rm -rf /etc/ssh/* #删除原先ssh的配置文件和目录
./configure --prefix=/usr/ --sysconfdir=/etc/ssh  --with-openssl-includes=/usr/local/ssl/include --with-ssl-dir=/usr/local/ssl   --with-zlib   --with-md5-passwords   --with-pam  && make && make install #配置编译安装

#如果遇到权限问题 permission 0640 for xxxx 将报权限问题的目录都设为600
chmod -R 0600 /etc/ssh/ssh_host_ecdsa_key

echo $? #同上
0

#修改sshd配置
vim /etc/sshd_config
PermitRootLogin yes
UseDNS no

#从安装目录cp文件到目标位置
cp -a contrib/redhat/sshd.init /etc/init.d/sshd
cp -a contrib/redhat/sshd.pam /etc/pam.d/sshd.pam
#设置执行权限
chmod +x /etc/init.d/sshd

#添加启动项
chkconfig --add sshd
systemctl enable sshd
#把原先的systemd管理的sshd文件删除或者移走或者删除,不移走的话影响我们重启sshd服务
mv /usr/lib/systemd/system/sshd.service  /tmp/
#设置开机启动
chkconfig sshd on

#重启sshd
systemctl restart sshd.service

#查看sshd是否启动
netstat -lntp

#测试版本
ssh -V
OpenSSH_8.3p1, OpenSSL 1.1.1g  21 Apr 2020

Linux 安装 FFmpeg

参考

Ubuntu

sudo apt install ffmpeg apt包

sudo snap install ffmpeg snap包

ffmpeg -version

Centos8

安装sdl软件包

SDL(Simple DirectMedia Layer)是一个自由的跨平台的多媒体开发包,

适用于 游戏、游戏SDK、演示软件、模拟器、MPEG播放器和其他应用软件

没有sdl包的情况下安装ffmpeg时,dnf会提示缺少libSDL2-2.0.so.0()

https://mirrors.aliyun.com/centos/8/PowerTools/x86_64/os/Packages/SDL2-2.0.10-2.el8.x86_64.rpm

安装rpmfusion仓库

dnf install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm 

如果没有rpmfusion这个仓库,安装ffmpeg时dnf会提示找不到匹配

dnf包管理工具安装ffmpeg

dnf install ffmpeg

ffmpeg -version

Centos7

RPM Fusion存储库

参考 How to Install and Use FFmpeg on CentOS 7

#依赖epel存储库,安装epel存储库
sudo yum install epel-release -y
sudo yum update -y

#安装启用RPM Fusion
sudo yum localinstall --nogpgcheck https://download1.rpmfusion.org/free/el/rpmfusion-free-release-7.noarch.rpm

#安装ffmpeg 
sudo yum install ffmpeg ffmpeg-devel

#查看版本
ffmpeg -version
ffmpeg version 3.4.8 Copyright (c) 2000-2019 the FFmpeg developers

经测试这个仓库速度很慢

Nux Dextop YUM 存储库

参考 How to Install FFmpeg on CentOS

#依赖epel存储库,安装epel存储库
sudo yum install epel-release -y
sudo yum update -y

#安装Nux Dextop存储库
sudo rpm --import http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
sudo rpm -Uvh http://li.nux.ro/download/nux/dextop/el7/x86_64/nux-dextop-release-0-5.el7.nux.noarch.rpm

#安装ffmpeg
sudo yum install ffmpeg ffmpeg-devel -y

#查看版本
ffmpeg -version
ffmpeg version 2.8.15 Copyright (c) 2000-2018 the FFmpeg developers

经测试这个仓库速度有时候也很慢

源码编译安装ffmpeg

Ubuntu 卸载多余的内核版本

参考

安装包安装卸载方式

  • 1.sudo dpkg –get-selections | grep ‘linux’
  • 2.sudo apt purge + image/headers名称

手动安装卸载方式

  • 1.删除/lib/modules/目录中以内核版本号为名称的目录
  • 2.删除/usr/src/linux/目录中并不需要的内核源码
  • 3.删除/boot目录中启动内核的和内核的映像文件
  • 4.sudo update-grub,更新内核启动列表

Laravel crontab 配置问题

参考

Lnmp环境运行时一般会指定用户www运行。因此配置定时任务的时候,也需要使用www用户来运行定时任务,否则会造成laravel生成的日志是其它用户,导致laravel运行报错,没有日志的可写权限。

配置方法

1.获取当前系统PHP的环境变量

执行 env > /tmp/env.output 然后 cat /tmp/env.output

找到PATH

PATH=/usr/local/mysql/bin:/usr/local/php/bin:/usr/local/nginx/sbin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

2.设置定时任务 -u 参数指定用户 命令参考 给www用户的crontab 添加环境变量PATH

crontab -u www -e

将PATH添加到crontab的第一行,

换行后将laravel的定时任务代码加上,截图中第二行, 制定了环境变量后,可以只写php 不用写php的完整路径 /usr/local/php/bin/php

3,不能遗漏的关键一步

在home目录下创建对应用户的文件目录,www 并修改用户权限为www 最后重启定时任务

cd home && mkdir www && chown -R www.www www
service crond restart

如果没有该用户的目录,crontab日志会有报错

(CRON) ERROR chdir failed (/home/www): No such file or directory

知识总结

Crontab详细介绍可以头部的参考链接,和《鸟哥linux私房菜-基础学习篇》第16章

任务调度分为两类: 系统任务调度 和 用户任务调度 

系统任务配置/etc/crontab

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed

前四行是用来配置crond任务运行的环境变量,

  • 第一行SHELL变量指定了系统要使用哪个shell,这里是bash,
  • 第二行PATH变量指定了系统执行命令的路径,
  • 第三行MAILTO变量指定了crond的任务执行信息将通过电子邮件发送给root用户,如果MAILTO变量的值为空,则表示不发送任务执行信息给用户,
  • 第四行的HOME变量指定了在执行命令或者脚本时使用的主目录。
  • 第五行 前五个星号代表时间, user-name代表执行的用户,command代表执行的命令

crontab – u xxx -e 是用来设置用户系统任务调度的

所有用户定义的crontab文件都被保存在/var/spool/cron目录中。其文件名与用户名一致,使用者权限文件如下

/etc/cron.deny     该文件中所列用户不允许使用crontab命令
/etc/cron.allow    该文件中所列用户允许使用crontab命令
/var/spool/cron/   所有用户crontab文件存放的目录,以用户名命名

注意单独用户的crontab配置需要设置 PATH 并创建对应用户目录

service crond start    # 启动服务
service crond stop     # 关闭服务
service crond restart  # 重启服务
service crond reload   # 重新载入配置
service crond status   # 查看状态

Uubntu 常用软件

系统快照软件Timeshift

https://linux.how2shout.com/how-to-install-timeshift-on-ubuntu-22-04-20-04-lts/

GUI主题

硬件驱动

工具类

快捷方式编写

WPS设置语言不跟随系统

新建一个空白文档,右上角A图标打开设置语言功能 ,不跟随系统,设置为中文

flameshot添加快捷方式

指令 flameshot gui  如图

chrome

wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb

qbittorrent

sudo add-apt-repository ppa:qbittorrent-team/qbittorrent-stable
sudo apt-get update && sudo apt-get install qbittorrent

开发工具

vscode

filezilla apt install filezilla

virtualbox

mysql-workbench 数据库管理工具

postman

remmina远程终端软件

dia画图软件

sudo apt-get install dia

Jmeter压测

redis-manager

sudo snap install redis-desktop-manager --edge

redinav redis-gui工具

wireshark抓包工具

umbrello uml建模工具

sudo apt install umbrello

phpstorm

DBeaver 数据库管理工具

Nodepad++

sudo snap install notepad-plus-plus

Typora

wget -qO - https://typora.io/linux/public-key.asc | sudo apt-key add -

# add Typora's repository
sudo add-apt-repository 'deb https://typora.io/linux ./'
sudo apt-get update

# install typora
sudo apt-get install typora

安装钉钉

https://github.com/nashaofu/dingtalk

https://github.com/nashaofu/dingtalk/issues/382

原型工具

pencil

github release 加速下载网站

http://tool.mkblog.cn/github/

https://hao.su/3415/

国外资源加速下载的方案

原理同百度网盘和迅雷的离线下载,

首先购买一台国外的vps,要求带宽不能太差,同时,国内连这个vps也不能太慢

1先将资源下载到vps上

2用ftp或scp将文件下载到本地

Markdown查看工具

wechat 安装

参考

注意事项

安装TopIcons Plus 商店里有

解决中文乱码

不知道从哪个版本开始,Ubuntu安装wine QQ后中文会变成方块。。。原因是wine QQ使用文泉驿字体, 此字体已不随机附带, 随机字体为Noto系列字体。

解决方法为安装对应字体

sudo apt install fonts-wqy-microhei fonts-wqy-zenhei

需注意文泉驿字体归于universe分支, 意味不受Canonical支援, 可能需要在apt sources中添加universe分支

sudo add-apt-repository universe

希望可以将字体并入dependencies中, 免去此麻烦。

解决微信无法发送图片

sudo apt install libjpeg62:i386

TIM 安装 PPAPI FLASH

sudo apt-get install pepperflashplugin-nonfree
sudo update-pepperflashplugin-nonfree --install

微信更新问题

如果出现微信提示跟新问题执行这一条语句即可 可能存在问题。

 wget -qO- https://deepin-wine.i-m.dev/setup.sh | sudo sh

覆盖文件升级方式,这个简单有效

https://blog.csdn.net/ysy950803/article/details/104045975

存在问题图片一直发送中,发不出去

Ubuntu 20.04 安装wechat

wget -O- https://deepin-wine.i-m.dev/setup.sh | sh

sudo apt-get install deepin.com.wechat

ubuntu20.04

推荐使用这个deepinwine

卸载重装后如果出现依赖问题参考

https://github.com/zq1997/deepin-wine/issues/220

新版 deepin-wechat 截图崩溃

ubuntu 安装JDK

https://blog.csdn.net/weixin_38924500/article/details/106215048

安装搜狗输入法

ubuntukylin源

官网版,20.04测试无效不好用,太坑了

https://pinyin.sogou.com/linux/help.php

amd64下载地址

Ubuntu20.04踩坑记录

无法进入设置中心,搜所不到setting

sudo dpkg -l|grep gnome-control-center

sudo dpkg -l|grep ubuntu-desktop

查询软件是否存在,如果不存在则执行重装

sudo apt install --reinstall gnome-control-center //重装控制中心

sudo apt -f install ubuntu-desktop //安装ubuntu桌面

卸载liboffices

https://jingyan.baidu.com/article/bad08e1e244b2109c85121f1.html

Snap core 无法更新解决 snap has no updates available

//更新一下所有软件,排除更新问题
sudo apt update && sudo apt upgrade
//杀死gnome-software进程
killall gnome-software
//重启电脑
reboot 

参考链接

https://askubuntu.com/questions/1321217/ubuntu-store-snap-update-fails

https://askubuntu.com/questions/1321097/snapd-runtime-environment-update

ubuntu22.04 支持华硕笔记本开启背光键盘

fn+f7 亮灯建

ubuntu pro 更新提示问题

https://askubuntu.com/questions/1452299/im-getting-the-error-the-following-security-updates-require-ubuntu-pro-with-e

最简单的方法删除

mkdir -p relocated_apt
sudo mv /etc/apt/apt.conf.d/20apt-esm-hook.conf ~/relocated_apt/.

引导修复工具

#安装
sudo add-apt-repository ppa:yannubuntu/boot-repair
sudo apt-get update
sudo apt-get install -y boot-repair

#卸载
sudo apt-get -y autoremove boot-repair
sudo add-apt-repository -r ppa:yannubuntu/boot-repair
sudo apt-get update

装双系统时,可以用来在grub中添加或修复windows boot项

supervisor安装使用

centos

安装

方式一

yum update

yum install -y supervisor

//yum安装会自动创建systemd脚本,可用systemd管理
systemctl enable supervisord //开机自启

systemctl disable supervisord //禁用开机自启

systemctl start supervisord//启动supervisor

systemctl reload supervisord //重新加载配置

systemctl stop supervisord //停止supervisor

方式二

yum update

yum install -y python-setuptools

easy_install supervisor

echo_supervisord_conf >/etc/supervisord.conf //创建配置文件

需要自己配置systemd脚本

ubuntu

sudo apt-get install supervisor

service supervisor status|start|stop|enable|disable

常用命令

supervisord -c /etc/supervisord.conf //指定配置文件启动

supervisorctl stop programxxx  //停止某一个进程

supervisorctl start programxxx //启动某一个进程

supervisorctl restart programxxx //重启某个进程

supervisorctl status  //查看进程状态

supervisorctl stop groupworker //重启所有属于名为 groupworker 这个分组的进程(start,restart 同理)

supervisorctl stop all //停止全部进程,注:start、restart、stop 都不会载入最新的配置文件

supervisorctl reload //载入最新配置文件,停止原有进程并按新的配置启动所有进程

supervisorctl update //根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启。

配置文件示例 (laravel项目为例)

#进程组名称
[program:laravel-worker-queue]
#进程名称
process_name=%(program_name)s_%(process_num)02d
#程序执行命令
command=/php-path/bin/php /www/www.youdomain.com/current/artisan queue:work redis --sleep=3 --tries=3 
#supervisor启动后自动启动
autostart=true 
#退出后自动重启
autorestart=true
#程序运行用户
user=www-data 
#supervisor启动进程数量
numprocs=5
#如果为true,则将进程的 stderr 输出发送回其 stdout 文件描述符上的 supervisord(在 UNIX shell 术语中,这相当于执行 /the/program 2>&1)
redirect_stderr=true
#日志大小
stdout_logfile_maxbytes=10MB
#日志数量
stdout_logfile_backups=20
#日志目录
stdout_logfile=/www/www.youdomain.com/current/storage/logs/worker.log

进程的基础知识

基本概念

程序是存储在硬盘上的编译生成的二级制可执行文件.不占用系统资源,是具体的.

进程是一个二进制程序(在内存中)的执行过程(运行实例).占用系统资源,是抽象的.

启动程序时,程序的文件会被加载到内存中,产生进程,结合系统分配的资源完成运行,程序关闭或退出时,进程会结束.

POSIX标准(可移植操作系统接口 Portable Operating System Interface),为了统一 类UNIX操作系统编程接口,方便跨平台编程和程序的可移植。参考:posix是什么都不知道,就别说你懂Linux了!

进程处理机制

1个单核CPU(或CPU的一个核心)在一个时间点只能处理一个进程.

我们用电脑同时运行多个程序,是因为操作系统的”多道程序设计”技术,内核控制CPU在多道进程间切换,它将CPU的整个生命周期划分为多个长度相同的时间片,在每个时间片内只处理一个进程。因为时间片很小,我们会感觉这些软件同时都在运行。这种分时间片实现的多任务系统,我们把它叫分时系统

CPU划分的时间片是微小的(比如纳秒),以及CPU的运算速度非常快,所以使用时感觉是同时运行多个程序.多核CPU在同时,多进程运行方面比单核CPU有优势.

假如内存中只有3个进程A,B,C,CPU时间片分配情况

多进程切换时。把当前任务状态先保存起来,把另一个任务的状态恢复,并把执行权交给它即可。俗称上下文切换。任务的状态就是一堆寄存器的值。要切换进程,只需要保存和恢复一堆寄存器的值即可。

进程的属性

OS内核能够区分进程并可获取进程属性,进程属性保存在名为进程控制块(Process Control Block)的中结构体中,内核为每个进程维护一个进程控制块,用于管理进程属性.

标识符

(1)进程标识符(Process Identifier)PID,32位非负无符号整形数据,进程的唯一标识,用来标识不同进程.

(2)父进程标识符(Parent Process Identifier)PPID,创建子进程的父进程对应的PID,在linux系统中,除init进程(编号为1)外,其余进程都有父进程. 吗

(3)用户标识符(User Identifier) UID ,标识创建这个进程的用户。PCB结构体中有euid概念(Effective User Identifier) ,即有效用户标识符,标识以有效权限发起进程的用户。例:用户yangliuan 以root权限发起进程,那么进程的uid对应的用户为yangliuan,进程的euid对应用户为root

(4)组标识符(Group Identifier)GID,标识创建进程的用户所属组。euid对应的组标识符为egid(Effective Group Identifier)

<?php
echo '进程标识[PID]:', posix_getpid(), PHP_EOL;
echo '父进程标识符[PPID]:', posix_getppid(), PHP_EOL;
echo '用户标识符[UID]:', posix_getuid(), PHP_EOL;
echo '有效用户标识符[EUID]:', posix_geteuid(), PHP_EOL;
echo '组标识符[GID]:', posix_getgid(), PHP_EOL;
echo '有效组标识符[EGID]:', posix_getegid(), PHP_EOL;

进程的状态

(1)就绪态

进程所需资源已经分配到位,只等待CPU,当可以使用CPU时,进程会立即变为运行态,内核会维护一个运行对列,用来装载所有就绪态的进程,当CPU空闲时,内核会从队列中选择一个进程,为其分配CPU

(2)运行态

进程处于此状态时会占用CPU,处于此状态的进程数量必定小于等于处理器数量,因为每个CPU在一个时间点只能运行一个进程

(3)睡眠态

此状态的进程不能占用CPU

不可中断睡眠态,是由外部I/O调用造成,等待外部I/O硬件设备响应,此状态不可中断,即我们常说的阻塞。举例进程向硬盘读写数据时,为了保证数据的一致性,在得到磁盘回复前,它是不能被其他进程或者中断打断的,这个时候的进程就处于不可中断状态

可终端睡眠态,进程对应的当前用户请求已处理完毕,暂时退出退出CPU,当用户再次发出请求,会立即被唤醒,这种状态被称为挂起,程序中常用的方法是sleep() (php为例) ,类比可以理解为汽车已点火,但是没有往前开。

(4)终止态

进程已运行完毕,此时进程不会被调度,也不再占用CPU

进程状态转换示意图

寄存器信息

寄存器的数量是有限的,cpu在进行进程切换时,会保存当前进程的数据,以边下次切换回来的时候从中断处继续进行。该过程称为cpu的上下文切换。在服务端多进程编程模型中,进程数和cpu核数该如何匹配

页表指针

百度百科 页表机制

程序运行时,系统会为其开辟一段虚拟内存,虚拟内存和物理内存映射时,各个虚拟内存中的地址相同的数据会被MMU(Memory Managenment 内存管理单元) 映射的到内存中的不同物理地址,PCB会存储虚拟地址和内存地址的对应关系

linux采用分页存储方式管理内存,进程载入到内存之前,系统将用户进程的逻辑空间分成若干个大小相等的片(称 页面或页)并编号,为进程分配内存时,以块为单位将进程中的若干页装入多个可以不相邻的物理块中,linux使用页面表来存储逻辑地址和物理地址的对应关系,页表的实质是一个结构体,每个进程的PCB中都有一个进项页表的指针。

进程组与会话

同一个进程组(process group)的进程 ,进程组由用户启动的进程创建,用户启动进程是进程组的领导进程(process group leader) ,进程组中的领导进程pid是识别进程组id,即pgid

会话(session)是进程组的集合,会话中的每一个进程组称为一个工作job,

进程控制

linux启动时创建一个init进程,进程pid为1,是所有进程的父进程,负责启动getty进程,设置进程运行级别 回收孤儿进程。

linux系统对进程的控制主要包含:进程创建,进程任务转变,进程同步,退出进程

1.创建进程

多道程序环境(多任务处理操作系统,可以同时运行多个程序)中需要创建进程的情况通常有4种:用户登录,作业调度,用户请求,应用请求。

当一个程序执行时,可能需要申请一些资源,如打开某个文件、请求某项服务 ,根据cpu运行的机制此时进程会进入睡眠态并放弃占用cpu,若要申请的资源与之后操作并不冲突,为了保障当前进程的持续进行(走完当前时间片),此时可以内存中在创建一个进程,让新的进程代替原进程执行资源申请的工作。

linux使用fork函数创建进程,系统会创建一个与原进程近乎相同的进程,之后父子进程都继续往下执行。如图

fork函数创建子进程

2.创建多个进程

fork函数创建进程时,系统会复制原程序,因此在通过父进程循环创建子进程时,要判断是不是父进程,只有父进程才能fork。

数据共享机制

子进程可以访问到与父进程完全相同的代码信息、数据信息和堆栈信息,在调用fork()函数时,遵循“读时共享写时复制”原则。

fork()函数创建子进程后,子进程获得父进程的数据空间,堆栈,页表,等副本,此时父子进程中变量的虚拟地址相同,虚拟地址对应的物理地址也相同,父子进程共享物理内存的页面信息,为了防止一方修改导致另一方出现访问异常,系统将页面信息标记为制度,fork()函数执行完毕。

之后父子进程都继续向下执行:此时子进程拥有与父进程相同的页表,若进程只需要进行数据访问,则到对应的物理地址中便能获取到数据,因为父子进程相同虚拟空间对应相同的物理地址,其访问机制如图。

读取时共享

若子进程要对数据段,堆栈中的数据进行修改, 系统会将待操作数据复制到内存中一块新的区域,修改副本数据为可写。之后子进程修改数据副本,因此父子进程可以保存各自的数据,父子进程中相同的虚拟地址对应内存中不同的物理地址。访问机制如图

写时复制

注意事项,同样的虚拟地址对应不通的物理地址,因为虚拟地址适合进程关联的,每个进程都有一段0~4G的虚拟内存,因此多个进程中会有数据处于相同虚拟地址 ,但虚拟内存只是系统的内存管理的一种技术,目的是使进程认为自己有一段连续的地址空间,方便分配与数据管理,他不是“实际”的,进程中的数据实际存在于内存对应的物理地址

进程的执行顺序

在linux系统中,子进程应该由父进程回收,但是当在子进程被创建后,他与父进程及其他进程共同竞争系统资源,所以父子进程执行顺序是不确定 ,终止的先后顺序也是不确定。(在没有人为控制的情况下,比如在父进程使用wait sleep)。

孤儿进程

父进程应该负责子进程的回收工作,但父子进程是异步运行的,若父进程在子进程退出之前退出,子进程就会变成孤儿进程,此时子进程会被init进程收养,之后init会替代原来的父进程完成状态收集工作。

僵尸进程

当进程调用了exit()函数之后,该进程并不是马上消失,而是留下一个称为僵尸进程的数据结构,僵尸进程是linux系统中另一种特殊进程,它几乎放弃了进程退出之前占用的所有内存,即没有可执行代码,也不能被调度,只能在进程列表中保留一个位置,记载进程的退出状态等信息供父进程收集。若父进程中没有回收子进程的代码,子进程将会一直处于僵尸态。

守护进程(daemon process) 后台进程

在后台运行的一种特殊进程,通常在系统启动时启动,并在系统关闭时终止。它们通常不与用户交互,而是在后台执行某些任务,例如监视文件系统或网络连接,或者执行定期任务。它们通常以超级用户(root)权限运行,以便可以执行需要特权的任务。原理,fork一个子进程,父进程退出与前台终端的交互,设置子进程为会话领导者。可以通过信号来控制启动关闭。

daemon希腊神话半人半精灵守护神

进程同步

在多道程序环境中,进程是并行执行的,父进程与子进程可能没有交集,各自独立执行,子进程的执行结果是父进程的下一步操作的先决条件,此时父进程必须等待子进程执行。我们把异步环境下的一组并发进程因相互制约而互相发送消息、互相合作、互相等待、使各个进程按一定的速度和顺序执行称为进程间的同步。

sleep()函数来控制进程的执行顺序,但这种方法是一种权益之计,系统中进程的执行顺序是由内核决定的,这种方法很难做到对进程精确控制

linux系统中提供了wait()函数 waitpid()函数(php中PCNTL提供了这两个函数)来获取进程状态,实现进程同步。调用wait()函数的进程

信号

软中断信号,本质是软件层次上对中断机制的一种模拟,用于提醒进程,某事件已经发生。kill -l查看系统中的信号

linux 详细信号列表及Linux信号和信号集

进程间通信( inter (国米) process communication IPC)

管道(piepline)

内核管理的缓冲区,形象的理解管道两端连接着两个进程 ,一个读取一个写入。linux系统中将管道视为文件

匿名管道( pipeline (管道) ),有亲缘关系的进程才可以使用,父子进程,兄弟进程。以字节流形式传输,需要约定好数据格式,缓存区为空或写满时会阻塞。shell终端 | 管道符号就是匿名管道,ls | wc

命名管道FIFO(first in first out),与匿名管道的区别,命名管道与系统中一个路径名关联,以文件的形式存在于文件系统中,进程可以通过FIFO路径名访问FIFO文件,实现进程间数据传输。遵循先进先出原则,缓存区为空或写满时会阻塞。

使用demo,待完善

php 命名管道函数 posix_mkfifo()

注意要和管道设计范式区分

How fast are Linux pipes anyway?

SystemV IPC

每个内核的IPC结构(消息队列,信号量,共享内存)都用一个非负整数的标识符加以引用。

php的扩展 Semaphore函数 命名和c语言及系统函数命名基本一致。

消息队列(sysvmsg)

消息队列的实质是一个存放消息的链表,由内核维护。每个消息视为一条记录,消息包括一个长整形的类型字段和需要传递数据。由消息队列标识符标识,有读写权限的进程可以从队列读取消息,写入消息到队列。通过key来找到对应消息队列。

如何使用?注意事项。使用demo,待完善

信号量(semaphore)

多进程之间可能因为进程合作和资源共享而产生制约关系。

直接相互制约关系

两个进程通过管道通信,管道为空时,读进程无法从管道读取数据,进入阻塞;管道满时,写进程无法向管道写入数据,进入阻塞。类似这种需要进程间合作导致的制约关系称为直接相互制约。进程间有同步关系

间接相互制约关系

假设当前系统中只有一台打印机,当A进程占用打印机时,进程B也申请使用打印机。进程B就会进入阻塞,等待打印机释放。其它进程同理。类似这种因资源共享导致的制约关系称为间接相互制约关系。进程间有互斥关系

临界资源

同步和互斥存在的根源是系统中存在临界资源(硬件资源:内存,打印机,硬盘;软件:共享代码段,变量等)。为了避免多进程的并发执行造成的不一致性,临界资源在同一时刻只允许有限个进程对其进行访问或修改。

信号量,是专门用户解决进程间同步与互斥问题的一种通信机制,它与信号无关,也不同于管道,FIFO以及消息队列 ,一般不用于传输数据,包含一个变量(表示资源数量,类型为非负整型),修改信号量的原子操作P和V,该信号量下等待资源进程的队列。

使用步骤

1.创建信号量/集,或者获取系统中已有的信号量/集。

2.初始化信号量/集。

3.信号量的P,V操作根据请求修改信号量数量,P操作使信号量-1,V操作使信号量+1.

4.从系统中删除不需要的信号量。

如何使用?注意事项。使用demo,待完善

共享内存(Shared memory)

允许多个进程访问给定的同一块存储区域。一般情况下,每个进程的虚拟地址空间会与不同的物理地址进行映射(参考上文页表指针)。当使用共享内存进行通信时,系统会将同一段物理内存映射给不同的进程,映射关系示意图如下。

映射关系

系统中的物理内存和虚拟内存都通过页面(页表)来管理,为多个进程分配共享内存实际是为进程分配一个或多个物理页面。因此共享内存的大小必须是系统中页面大小的整数倍。

进程使用共享内存时,先将虚拟内存空间与共享内存进行映射,映射完成后,进程对虚拟地址的读写,就相当于直接对物理内存读写。通信完成后需要释放物理内存解除进程与共享内存的映射关系。

共享内存,因为是进程直接读写物理内存,了不同进程间多次读写的时间。共享内存本身不限制读写次序,但是开发人员应该自觉遵循读写规则,在写进程操作尚未完成时,不应该有进程从共享内存中读取数据。通常,共享内存和信号量一起使用,由信号量帮它实现读写操作的同步。

如何使用?注意事项。使用demo,待完善

参考

ubuntu 启动项管理工具

参考

启动软件图形化管理工具

单机show application 显示所有应用 搜索 startup application

可以通过 add remove edit 添加,删除,编辑来管理启动软件,该软件是ubuntu系统自带的

有些应用没有显示出来可以通过下列命令设置

sudo sed -i 's/NoDisplay=true/NoDisplay=false/g' /etc/xdg/autostart/*.desktop

执行之后多了好多软件

管理服务

Ubuntu或者Debian系统中update-rc.d命令,是用来更新系统启动项的脚本。这些脚本的链接位于/etc/rcN.d/目录,对应脚本位于/etc/init.d/目录。在了解update-rc.d命令之前,你需要知道的是有关Linux系统主要启动步骤,以及Ubuntu中运行级别的知识。

Linux系统主要启动步骤


读取 MBR 的信息,启动 Boot Manager。   
加载系统内核,启动 init 进程, init 进程是 Linux 的根进程,所有的系统进程都是它的子进程。   
init 进程读取 /etc/inittab 文件中的信息,并进入预设的运行级别。通常情况下/etc/rcS.d/ 目录下的启动脚本首先被执行,然后是/etc/rcN.d/ 目录。
根据 /etc/rcS.d/文件夹中对应的脚本启动 Xwindow 服务器 xorg,Xwindow 为 Linux 下的图形用户界面系统。
启动登录管理器,等待用户登录。

Ubuntu 中的运行级别

0 (关闭系统) 
1 (单用户模式,只允许root用户对系统进行维护。) 
2 到 5(多用户模式,其中3为字符界面,5为图形界面。) 
6 (重启系统)

切换运行级别

init [0123456Ss]
init 0 #命令关机; 
init 6 #命令重新启动

update-rc.d 的具体用法:

删除所有级别中的开机自启动 

update-rc.d -f <basename> remove 
-f: 强制删除所有符号链接 

basename就是要删除的程序的名称

删除boa的所有开机启动项:
sudo update-rc.d -f  boa remove

执行结果:

 Removing any system startup links for /etc/init.d/boa ...
   /etc/rc0.d/K20boa
   /etc/rc1.d/K20boa
   /etc/rc2.d/K20boa
   /etc/rc3.d/K20boa
   /etc/rc4.d/K20boa
   /etc/rc5.d/K20boa
   /etc/rc6.d/K20boa
添加boa开机启动项
sudo update-rc.d boa default

启动项终端图形管理界面

sudo apt-get install sysv-rc-conf

如果提示错误 Unable to locate package sysv-rc-conf,按如下方法处理

//1.编辑源文件
sudo gedit /etc/ap/sources.list
//2.将一下文本添加到文件中,如下图
deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse
//3.执行sudo apt update 更新后 重新安装

图形界面执行 sudo sysv-rc-conf

Linux 软件管理常用命令

yum 和 rpm 软件管理

rpm命令 yum命令

yum下载软件包方法,应用场景,大型国企生产环境不允许开放外网

通过yum命令只下载rpm包不安装

yum 下载全量依赖 rpm 包及离线安装(终极解决方案

dnf软件管理

dnf命令

APT工具(新立得)

apt的全称是Advanced Packaging Tool是Linux系统下的一款安装包管理工具

保持依赖不更新

sudo apt-mark hold libqt5core5a libqt5dbus5 libqt5gui5 libqt5network5 libqt5qml5 libqt5qmlmodels5 libqt5quick5 libqt5widgets5

取消依赖不更新

sudo apt-mark unhold libqt5core5a libqt5dbus5 libqt5gui5 libqt5network5 libqt5qml5 libqt5qmlmodels5 libqt5quick5 libqt5widgets5

PPA管理

apt-key命令

sudo apt-key list
会出现这样:
pub   1024R/B455BEF0 2010-07-29
uid                  Launchpad clicompanion-nightlies
删除想删除的
sudo apt-key del B455BEF0

添加PPA源的命令为:
sudo add-apt-repository ppa:user/ppa-name
添加好更新一下: sudo apt-get update
删除命令格式则为:
sudo add-apt-repository -r ppa:user/ppa-name

或者
到源的目录:cd  /etc/apt/sources.list.d/ 可以看到关于源的文件,删除即可 

DPKG

dpkg 是Debian package的简写,为”Debian“ 操作系统 专门开发的套件管理系统,用于软件的安装,更新和移除。

所有源自”Debian”的Linux的发行版都使用 dpkg,   例如”Ubuntu”。

dpkg本身是一个底层的工具。上层的工具,如APT,被用于从远程获取软件包以及处理复杂的软件包关系。 

安装指定软件包

dpkg -i|--install <.deb file name> ... | -R|--recursive <directory> ...
ex:dpkg -i -R /dirname 安装目录下的所有deb包

解压软件包

dpkg --unpack <.deb file name> ... | -R|--recursive <directory> ...
ex:dpkg --unpack -R /dirname 解压目录下的deb包

重新配置和释放软件包

dpkg --configure <package> ... | -a|--pending
-a 将配置所有没有配置的软件包 

dpkg  --triggers-only <package> ... | -a|--pending

移除软件包

dpkg -r|--remove <package> ... | -a|--pending

移除软件包和配置

dpkg -P|--purge  <package> ... | -a|--pending

-V|–verify <软件包名> … 检查包的完整性

–get-selections [<表达式> …] 把已选中的软件包列表打印到标准输出

–set-selections 从标准输入里读出要选择的软件

–clear-selections 取消选中所有不必要的软件包

–update-avail <软件包文件> 替换现有可安装的软件包信息

–merge-avail <软件包文件> 把文件中的信息合并到系统中

–clear-avail 清除现有的软件包信息

–forget-old-unavail 忘却已被卸载的不可安装的软件包

-s|–status <软件包名> … 显示指定软件包的详细状态

-p|–print-avail <软件包名> … 显示可供安装的软件版本

-L|–listfiles <软件包名> … 列出属于指定软件包的文件 查看已安装文件的路径

dpkg -L libwebp-dev
/usr
/usr/include
/usr/include/webp
/usr/include/webp/decode.h
...

-l|–list [<表达式> …] 简明地列出软件包的状态

-S|–search <表达式> … 搜索含有指定文件的软件包

-C|–audit [<表达式> …] 检查是否有软件包残损

–yet-to-unpack 列出标记为待解压的软件包

–predep-package 列出待解压的预依赖

–add-architecture <体系结构> 添加 <体系结构> 到体系结构列表

–remove-architecture <体系结构> 从架构列表中移除 <体系结构>

–print-architecture 显示 dpkg 体系结构 指的是cpu的体系架构 例amd64

–print-foreign-architectures 显示已启用的异质体系结构

–assert-<特性> 对指定特性启用断言支持

–validate-<属性> <字符串> 验证一个 <属性>的 <字符串>

–compare-vesions <a> <关系> <b> 比较版本号 – 见下

–force-help 显示本强制选项的帮助信息

-Dh|–debug=help 显示有关出错调试的帮助信息
-?, –help 显示本帮助信息

–version 显示版本信息
Assert 特性: support-predepends, working-epoch, long-filenames, multi-conrep, multi-arch, versioned-provides.
可验证的属性:pkgname, archname, trigname, version.
调用 dpkg 并带参数 -b, –build, -c, –contents, -e, –control, -I, –info, -f, –field, -x, –extract, -X, –vextract, –ctrl-tarfile, –fsys-tarfile是针对归档文件的 (输入 dpkg-deb –help 获取帮助)
选项:

–admindir=<目录> 使用 <目录> 而非 /var/lib/dpkg

–root=<目录> 安装到另一个根目录下

–instdir=<目录> 改变安装目录的同时保持管理目录不变

–path-exclude=<表达式> 不要安装符合Shell表达式的路径

–path-include=<表达式> 在排除模式后再包含一个模式

-O|–selected-only 忽略没有被选中安装或升级的软件包

-E|–skip-same-version 忽略版本与已安装软件版本相同的软件包

-G|–refuse-downgrade 忽略版本早于已安装软件版本的的软件包

-B|–auto-deconfigure 就算会影响其他软件包,也要安装

–[no-]triggers 跳过或强制随之发生的触发器处理

–verify-format=<格式> 检查输出格式(‘rpm’被支持)

–no-debsig 不去尝试验证软件包的签名

–no-act|–dry-run|–simulate 仅报告要执行的操作 – 但是不执行

-D|–debug=<八进制数> 开启调试(参见 -Dhelp 或者 –debug=help)

–status-fd <n> 发送状态更新到文件描述符<n>

–status-logger=<命令> 发送状态更新到 <命令> 的标准输入

–log=<文件名> 将状态更新和操作信息到 <文件名>

–ignore-depends=<软件包>,… 忽略关于 <软件包> 的所有依赖关系

–force-… 忽视遇到的问题(参见 –force-help)

–no-force-…|–refuse-… 当遇到问题时中止运行

–abort-after <n> 累计遇到 <n> 个错误后中止


可供–compare-version 使用的比较运算符有:

lt le eq ne ge gt (如果版本号为空,那么就认为它先于任意版本号);

lt-nl le-nl ge-nl gt-nl (如果版本号为空,那么就认为它后于任意版本号);

< << <= = >= >> > (仅仅是为了与主控文件的语法兼容)

Snap 官方文档

Snap是Canonical推出的一种新的软件打包格式,彻底解决linux依赖性的问题,Snap 软件包拥有更加稳定和安全的特性。snap也就是安装snap软件包的命令。

安装snap

sudo apt install snap 

列出计算机上所有snap安装情况:

sudo snap list

在应用商店中查找snap:

sudo snap find <软件包名>

安装Snap软件:

sudo snap install <snap软件包名>


更新Snap软件:

sudo snap refresh <snap软件包名>

更新所有的snap软件包:

sudo snap refresh

要将Snap还原到以前安装的版本:

sudo snap revert <snap软件包名>

卸载snap软件:

sudo snap remove <snap软件包名>

参考

Linux网络调试 常用命令和分析工具 排查方法

查看/配置网络

ifconfig 查看IP地址

https://wangchujiang.com/linux-command/c/ifconfig.html

enx00e04cf0a10c: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.1.5  netmask 255.255.255.0  broadcast 192.168.1.255
        inet6 2408:8207:305c:1c30:b48f:56c7:81bb:bb9  prefixlen 64  scopeid 0x0<global>
        inet6 fe80::2c1b:1b85:35cd:9642  prefixlen 64  scopeid 0x20<link>
        inet6 2408:8207:305c:1c30:e49b:195a:eeaa:1e44  prefixlen 64  scopeid 0x0<global>
        ether 00:e0:4c:f0:a1:0c  txqueuelen 1000  (Ethernet)
        RX packets 29715  bytes 31484642 (31.4 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 22107  bytes 3794564 (3.7 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 4003  bytes 2920205 (2.9 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4003  bytes 2920205 (2.9 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
 
wlp4s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.111  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 fe80::6e92:514f:2d68:1da1  prefixlen 64  scopeid 0x20<link>
        ether 14:4f:8a:60:f2:2a  txqueuelen 1000  (Ethernet)
        RX packets 106  bytes 9074 (9.0 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 129  bytes 19965 (19.9 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

e开头的一般是有线网卡 例eth

lo 全称是 loopback,又称环回接口,往往会被分配到 127.0.0.1 这个地址。这个地址用于本机通信,经过内核处理后直接返回,不会在任何网络中出现

wlp开头表示无线网卡

flags = 4163 没有搜到什么意思

UP表示接口启用

BROADCAST 表示主机支持广播

RUNNING 表示接口正在工作

MULTICAST 主机支持多播

MTU:1500 最大传输单元 1500字节 百科

inet 网卡的IP地址

netmask 网络掩码

broadcast 广播地址

inet6 fe80::2aa:bbff:fecc:ddee prefixlen 64 scopeid 0x20<link> IPv6地址

ether 00:e0:4c:f0:a1:0c 连接类型:Ethernet (以太网) HWaddr (硬件mac地址)

txqueuelen (网卡设置的传送队列长度)

RX packets 接收时,正确的数据包数

RX bytes 接收的数据量

RX errors 接收时,产生错误的数据包数

RX overruns 接收时,由于速度过快而丢失的数据包数

RX dropped 接收时,丢弃的数据包数

RX frame 接收时,发生frame错误而丢失的数据包数

TX carrier 发送时,发生carrier错误而丢失的数据包数

TX collisions 冲突信息包的数目

mii-tool 配置网络设备协商方式的工具

https://wangchujiang.com/linux-command/c/mii-tool.html

是用于查看、管理介质的网络接口的状态,有时网卡需要配置协商方式,比如10/100/1000M的网卡半双工、全双工、自动协商的配置。但大多数的网络设备是不用我们来修改协商,因为大多数网络设置接入的时候,都采用自动协商来解决相互通信的问题。不过自动协商也不是万能的,有时也会出现错误,比如丢包率比较高,这时就要我们来指定网卡的协商方式。mii-tool就是能指定网卡的协商方式。下面我们说一说mii-tool的用法。

sudo mii-tool -v enx00e04cf0a10c
enx00e04cf0a10c: negotiated 100baseTx-FD, link ok
product info: vendor 00:07:32, model 0 rev 0
basic mode: autonegotiation enabled
basic status: autonegotiation complete, link ok
capabilities: 1000baseT-FD 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD
advertising: 1000baseT-FD 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD flow-control
link partner: 100baseTx-FD 100baseTx-HD 10baseT-FD 10baseT-HD

link ok 表示网线连接ok

basic mode: autonegotiation enabled 启用自动协商

route 查看网关

https://wangchujiang.com/linux-command/c/route.html

显示并设置Linux中静态路由表

常用方式 route -n 不执行DNS反向查找,直接显示数字形式的IP地址

route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG    100    0        0 enx00e04cf0a10c
0.0.0.0         192.168.0.1     0.0.0.0         UG    600    0        0 wlp4s0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 wlp4s0
192.168.0.0     0.0.0.0         255.255.255.0   U     600    0        0 wlp4s0
192.168.1.0     0.0.0.0         255.255.255.0   U     100    0        0 enx00e04cf0a10c

ip 网络配置工具

https://wangchujiang.com/linux-command/c/ip.html

用来显示或操纵Linux主机的路由、网络设备、策略路由和隧道

支持信息的object

OBJECT := { link | address | addrlabel | route | rule | neigh | ntable | tunnel | tuntap | maddress | mroute | mrule | monitor | xfrm | netns | l2tp | macsec | tcp_metrics | token }

nc 全称netcat

用于设置路由器。它能通过 TCP 和 UDP 在网络中读写数据。通过与其他工具结合和重定向,你可以在脚本中以多种方式使用它。

https://wangchujiang.com/linux-command/c/nc.html

查看端口实例

nc -vz xiaoyuapi.zcoming.com 443 -w2
Connection to xiaoyuapi.zcoming.com 443 port [tcp/https] succeeded!

故障排除

ping 测试主机之间网络的连通性

https://wangchujiang.com/linux-command/c/ping.html

执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常

traceroute 显示数据包到主机间的路径

https://wangchujiang.com/linux-command/c/traceroute.html

用于追踪数据包在网络上的传输时的全部路径,它默认发送的数据包大小是40字节。

通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的。

traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间。一条路径上的每个设备traceroute要测3次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其ip地址。

traceroute www.58.com
traceroute to www.58.com (211.151.111.30), 30 hops max, 40 byte packets
 1  unknown (192.168.2.1)  3.453 ms  3.801 ms  3.937 ms
 2  221.6.45.33 (221.6.45.33)  7.768 ms  7.816 ms  7.840 ms
 3  221.6.0.233 (221.6.0.233)  13.784 ms  13.827 ms 221.6.9.81 (221.6.9.81)  9.758 ms
 4  221.6.2.169 (221.6.2.169)  11.777 ms 122.96.66.13 (122.96.66.13)  34.952 ms 221.6.2.53 (221.6.2.53)  41.372 ms
 5  219.158.96.149 (219.158.96.149)  39.167 ms  39.210 ms  39.238 ms
 6  123.126.0.194 (123.126.0.194)  37.270 ms 123.126.0.66 (123.126.0.66)  37.163 ms  37.441 ms
 7  124.65.57.26 (124.65.57.26)  42.787 ms  42.799 ms  42.809 ms
 8  61.148.146.210 (61.148.146.210)  30.176 ms 61.148.154.98 (61.148.154.98)  32.613 ms  32.675 ms
 9  202.106.42.102 (202.106.42.102)  44.563 ms  44.600 ms  44.627 ms
10  210.77.139.150 (210.77.139.150)  53.302 ms  53.233 ms  53.032 ms
11  211.151.104.6 (211.151.104.6)  39.585 ms  39.502 ms  39.598 ms
12  211.151.111.30 (211.151.111.30)  35.161 ms  35.938 ms  36.005 ms

记录按序列号从1开始,每个纪录就是一跳 ,每跳表示一个网关,我们看到每行有三个时间,单位是ms,其实就是-q的默认参数。探测数据包向每个网关发送三个数据包后,网关响应后返回的时间;如果用traceroute -q 4 www.58.com,表示向每个网关发送4个数据包。

有时我们traceroute一台主机时,会看到有一些行是以星号表示的。出现这样的情况,可能是防火墙封掉了ICMP的返回信息,所以我们得不到什么相关的数据包返回数据。

有时我们在某一网关处延时比较长,有可能是某台网关比较阻塞,也可能是物理设备本身的原因。当然如果某台DNS出现问题时,不能解析主机名、域名时,也会 有延时长的现象;您可以加-n参数来避免DNS解析,以IP格式输出数据。

如果在局域网中的不同网段之间,我们可以通过traceroute 来排查问题所在,是主机的问题还是网关的问题。如果我们通过远程来访问某台服务器遇到问题时,我们用到traceroute 追踪数据包所经过的网关,提交IDC服务商,也有助于解决问题;但目前看来在国内解决这样的问题是比较困难的,就是我们发现问题所在,IDC服务商也不可能帮助我们解决。

mtr My traceroute

https://www.cnblogs.com/alexyuyu/articles/2811346.html

Linux 网络诊断工具MTR(My traceroute) 结合了ping跟tracert的一个工具

首先看最后一行,目标服务器有没有丢包,有的话再往前分析。

测试指定端口实例

sudo mtr -P 443 -i 0.5 -rwc 50 xiaoyuapi.zcoming.com

nslookup

是常用域名查询工具,就是查DNS信息用的命令。

https://wangchujiang.com/linux-command/c/nslookup.html

非交互模式直接加域名

nslookup xiaoyuapi.zcoming.com
Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
Name:	xiaoyuapi.zcoming.com
Address: 47.92.203.163

telnet 登录远程主机和管理(测试ip端口是否连通)

https://wangchujiang.com/linux-command/c/telnet.html

telnet因为采用明文传送报文,安全性不好,很多Linux服务器都不开放telnet服务,而改用更安全的ssh方式了。但仍然有很多别的系统可能采用了telnet方式来提供远程登录,因此弄清楚telnet客户端的使用方式仍是很有必要的

检测端口,如下表示端口正常

telnet xiaoyuapi.zcoming.com 443
Trying 47.92.203.163...
Connected to xiaoyuapi.zcoming.com.
Escape character is '^]'.

tcpdump

https://wangchujiang.com/linux-command/c/tcpdump.html

 是一款抓包,嗅探器工具,它可以打印所有经过网络接口的数据包的头信息,也可以使用-w选项将数据包保存到文件中,方便以后分析

netstat 查看Linux中网络系统状态信息

https://wangchujiang.com/linux-command/c/netstat.html

可以查看网络协议tcp/udp ip地址监听状态 程序进程id等

netstat -ltnp //查看监听中的进程

ss socket统计信息

https://wangchujiang.com/linux-command/c/ss.html

比 netstat 好用的socket统计信息,iproute2 包附带的另一个工具,允许你查询 socket 的有关统计信息

命令安装

有些发行版可能没有这些命令需要自己安装

net-tools包含以下常用的命令:apt-get install net-tools

  • ifconfig:显示和配置网络接口的信息。
  • netstat:显示网络连接、路由表和网络统计信息。
  • arp:显示和操作ARP缓存。
  • route:显示和操作IP路由表。
  • hostname:显示或设置系统的主机名。

iproute2包含以下常用的命令: apt-get install iproute2

  • ip:用于配置和管理网络接口、路由表、策略路由、隧道、桥接等各种网络参数。
  • ss:显示套接字统计信息,包括网络连接、监听端口、进程关联的套接字等。
  • bridge:用于配置和管理网络桥接。
  • tc:配置和管理流量控制策略。
  • ipset:管理iptables使用的IP集合。
  • nstat:显示网络统计信息。
  • rtacct:显示路由表统计信息。

traceroute命令需要 apt-get install traceroute

网络监控工具

nethogs https://wangchujiang.com/linux-command/c/nethogs.html

//安装
sudo apt install nethogs
sudo yum install nethogs

//使用
sudo nethogs -d 1
sudo nethogs eth0 -d 1
GUI

网络问题排查思路

1.查看服务器服务是否正常,你的网络能否正常访问

当用户反馈APP或网站无法访问或卡顿的时候,首先用你的网络测试一下能否正常访问,

然后排查服务器是否有问题CPU,内存,网络,指标是否正常,进程数量,TCP连接数量 平均负载

各种日志,负载均衡日志,nginx日志,程序日志

2.客户端排查,收集详细的用户反馈

先让用户访问一些常用的网站和app,比如百度等,排除是否是用户的网络问题

收集问题用户数据,手机型号, 操作系统,网络类型(3G,4G,wifi) 运营商(移动,联通,电信),点击哪个模块哪个功能出现的网络故障提示,什么时间点,最好能录屏或者截个图。

或者在程序中增加功能,网络不好的时候弹窗提示用户反馈信息,用户点击反馈按钮收集客户端的ip操作系统型号,上报给服务器并记录下来,通过ip可以获取网络运营商的信息。

3.通过第三方测试平台,模拟用户的网络环境

站长之家测速工具

云服务提供商也用类似站点监控的工具 通过以上工具测试否为运营商问题

4.APP(移动测试)远程真机调试

参考

手机远程真机调试平台汇总
有哪些好用的App云测试平台

目前对移动App的测试主要指的是下面几部分:

兼容性测试——App对不同手机、操作系统版本的兼容性测试,包括安装、启动、卸载等。
功能测试——遍历应用的每一个角落,查看应用的功能、逻辑是否正常,完整。
性能测试——应用的性能怎样,如启动时间、反应时间、CPU占用率,内存占用率等。
稳定性测试——在一定时间内对App进行持续地测试,测试App运行的稳定性。
网络场景测试——测试不同网络环境中App的运行状况,如2G&3G,弱网络等。

Testin:Testin云测|全球领先的App及手游测试平台

腾讯优测:优测网-让测试更简单

贯众云测试:贯众云测试

百度MTC:百度移动云测试中心

阿里MQC:MQC 阿里移动质量中心

参考