【二、玩转vim(vi)编辑器】三大模式及命令介绍、如何通过配置文件.vimrc配置vim编辑器(一)
一、vim三大模式的关系以及如何配置vim为默认编辑器1. 三种模式的切换vim编辑器有三个模式:命令模式(command mode)、插入模式(Insert mode)也叫做编辑模式、末行模式(last line mode)也叫底行模式。我们在shell下输入命令vi或者vim加要编辑的文件名就可以进入vi或vim编辑器(我们一般使用vim,因为vim是vi的加强版,功能更为强大)。我们在shell下初次进入vim是进入到vim的命令模式,在命令模式下按a/i/o/s等插入键进入插入模式,插入模式下按ESC回到命令模式。在命令模式下按 : 进入末行模式,末行模式下按两次ESC回到命令模式。末行模式和插入模式之间不能直接切换。2. 配置vim为默认编辑器我们在shell下敲击命令vim就可以进入vim编辑器,敲击vi默认是进入vi编辑器。我们也可以通过过配置,当输入vi的时候也进入vim编辑器,有两种方法。① 通过别名设置alias vi="vim"非常简单,通过别名实现,一句话搞定。② 执行下列指令1. sudo update-alternatives --install /usr/bin/editor editor /usr/bin/vim 1
2. sudo update-alternatives --set editor /usr/bin/vim
3. sudo update-alternatives --install /usr/bin/vi vi /usr/bin/vim 1
4. sudo update-alternatives --set vi /usr/bin/vim二、vim三种模式下的命令介绍学习vim可以使用官方的教程,在shell下输入命令就能查看vim教程vimtutor通过上下键就可以翻页学习。 1. vim的命令模式(command mode)在shell下通过vim进入vim编辑器后就是命令模式,在命令模式下按下的键都会当作命令去执行,命令模式界面如下,最低下一行会显示文件名和当前光标所在行号。(1)移动光标最基本的上下左右移动,可以在教程中看到,四个方向键和k/h/j/l四个字母键。 光标移动相关的命令如下表所示:命令作用h/左键光标左移一个字符j/下键光标下移一个字符k/上键光标上移一行l(小写L)/右键光标下移一行0 (数字0)移动到光标所在行行首$ (shit + 4)移动到光标所在行行尾gg移动到整个文件的首部(文件的第一个字符处)shift+g (G)移动到整个文件的尾部(G可以是shift+g,也可以是CapsLk开启大写键后直接按G键)n shift+g (nG)移动到第n行(先按数字键指定n,然后按住shift键不放,同时按g键)(2)复制、粘贴、删除、剪切① 删除与剪切之所以把删除和剪切放在一起,是因为删除的内容会放在剪切板上,可以通过粘帖把剪切板(刚删除)的内容粘帖回来,这样删除就起到了和剪切一样的效果。其实,删除就是剪切,剪切就是删除,如果删除后不粘帖那就是删除,如果删除后进行粘贴操作,那就是剪切。命令作用x (小写x)删除光标后面的字符d+l(小写L)/右键shift+x (大写X)删除光标前面的字符(X可以是shift+x,也可以是CapsLk开启大写键后直接按X键)d+h/左键d+方向键(箭头或hjkl)删除相应方向的字符或行(不建议用)dw删除光标所在位置到光标所在单词的尾部d shift+4 (d+$)删除光标所在位置一直到行尾(D可以是shift+d,也可以是CapsLk开启大写键后直接按D键)shift+d (D)dd删除一整行ndd删除光标所在行开始的n行操作演示:dw删除指令演示 ndd命令演示,先按数字键,然后快速按两次d键② 复制与粘贴 粘贴操作既可以在复制后进行,也可以在删除(剪切)后进行命令作用yy复制光标所在行到剪切板p (小写p)将剪切板内容粘贴到光标所在位置的下一行P (大写P)将剪切板内容粘贴到光标所在位置的上一行 通过粘贴前后对比可以看到,粘贴会新开辟一行然后把剪切板内容复制到新开辟的这一行,而不会把原来的上一行或下一行覆盖掉,原来的下一行变为粘贴行的下一行。(4)查找命令比如要查找文件内所有的string命令用法及解释/命令模式下,直接输入 /string ,回车,从文件顶部开始查找文件内所有string并高亮显示? (shift+/)命令模式下,直接输入?string,回车,从文件底部开始查找文件内所有string并高亮显示#把光标移动到要查找的字符串string上,按#便可以查找所有string并高亮显示n向下遍历查找到的字符串(依次选中下一个高亮显示的string)N (shift+n)向上遍历查找到的字符串(依次选中上一个高亮显示的string)① / 与 n 用法演示(?与N同理)当我们按下 / 后,在最下面会变成这样 然后在 / 后面输入需要查找的字符串按回车键可以看到,所有的printf都已经高亮显示了 按一下n可以发现,光标移动到下一个高亮显示的printf处了 ② #用法演示把光标停在要查找的字符串处,按#即可高亮选出所有,通过n和shift+n可以在被选出的字符串之间遍历。(5)替换命令与替换模式命令作用r在输入一个字符c,就可以将光标后面的一个字符替换为cshift+r (R)进入替换模式Esc退出替换模式① 替换单个字符找到要替换的字符,把光标停在字符前面,按r,在输入需要替换成的目标字符就可以替换成功。 ② 进入替换模式按 shift+r 也就是R就可以进入替换模式,这时会在最下面显示替换二字 现在就可以通过上下左右键来移动光标,并输入字符替换光标后面的字符,直到按Esc键退出替换模式。(6)可视化模式 命令模式下按v就可以进入可视模式,我们在前面讲的复制粘贴删除等等操作只能是按行、按单词或者按字母操作,在可视模式下,我们可以通过选中来操作自己需要的任意个字符。可视模式的作用相当于Windows下,你按住鼠标左键并拖动,这样一个选中功能,然后在对选中的内容进行操作。命令作用v命令模式下按v进入可视模式,通过移动光标来选中内容y复制d删除(剪切)p在光标位置后面粘贴P (shift+p)在光标位置前面粘贴操作演示:按下v的时候就相当于按下了鼠标的左键,通过方向键移动光标就相当于移动鼠标来选中内容,然后对选中的内容操作。首先在命令模式下按一下v(按完就松开,不用像鼠标一样一直按着),然后按左键和下键选中几行内容 等需要的内容全部被选中后,按y进行复制,然后移动光标到需要粘贴的位置,按p复制完成,如果需要再次操作,在按一下v,然后进行上面的操作。
一、QEMU环境配置
本文原文链接:https://xuesong.blog.csdn.net/article/details/80835793?spm=1001.2014.3001.5502一、QEMU环境配置• 1、搭建嵌入式开发基本环境• 2、QEMU安装及A9开发板配置介绍• 3、编译、运行Linux内核• 4、使用BusyBox制作根文件系统• 5、使用U-boot引导启动Linux内核• 6、挂载NFS文件系统• 7、在虚拟开发板上开发应用程序、驱动示例1、搭建嵌入式开发基本环境• 1.1、Vmware+Ubuntu16.04• 1.2、Vmwaretools• 1.3、更新软件源• 1.4、安装uboot-tools• 1.5、代码编辑管理工具:Git/vim• 1.6、交叉编译器:gcc-arm-linux-gnueabi• 1.7、其他1.1、Vmware+Ubuntu16.04虚拟机使用vmware player推荐使用Ubuntu16.041、Ubuntu16.04是LTS(Long Term Support)长期Support版本2、软件包丰富,可以默认安装arm-gcc编辑器1.2、Vmware-tools安装vmware-tools:跟主机之间拷贝文件安装1、直接把WMwareTools拷贝出来到桌面吧2、然后打开终端解压 命令:tar -xzvf VMwareTools-10.0.6-3595377.tar.gz3、进入解压后的目录,执行:sudo ./wmware-install.pl 然后就一直回车了。1.3、更新软件源1.3.1、什么是软件源?• Ubuntu采用集中式的软件仓库机制,将软件包分类存在软件仓库中,进行管理。软件仓库放置在各种镜像服务器中,对于用户来说,当使用apt-get install安装软件包时,会从这些服务器下载软件包,这些镜像服务器就是 软件源(Reposity).1.3.2、工作原理• 执行apt update,程序分析/etc/apt/source.list• 自动联网寻找list中对应的Packages/Sources/Release列表文件,如果有更新则重新下载之,存入存入/var/lib/apt/lists/目录• 然后apt install相应的包,下载到本地并进行安装• /var/lib/dpkg/available:软件包的描述信息,软件源中所有软件包中的信息,包括安装和未安装的软件包• /var/cache/apt/archives:当apt install安装软件包的临时存放路径• /etc/apt/sources.list:文件里是软件源站点,apt install时,Ubuntu会从这些站点下载软件包到本地并进行安装• /var/lib/apt/lists:使用apt update命令会从/etc/apt/sources.list中下载软件包列表索引,并保存到该目录1.3.3、软件源的更换备份系统本身源文件cp /etc/apt/sources.list /etc/apt/sources.list.backup修改源文件内容,将新的源地址写入该文件中//先安装vim:apt-get insatll vim
vim /etc/apt/sources.list保存文件,并刷新配置apt update1.4、安装uboot-tools• 工具介绍• 用来生成适应U-boot引导的镜像文件格式$ apt install u-boot-tools1.5、代码编辑管理工具:Git/vimapt install git
apt install tree初始化仓库: git initgit add name //上传git status //看修改git log提交:先设置邮箱和名字1.6、交叉编译器:gcc-arm-linux-gnueabi什么是交叉编译?• 在一种计算机环境中编译程序,在另外一种环境下运行。或者说在一个平台上编译生成在另一个平台上运行的可执行代码。什么是ABI和EABI• ABI: 二进制应用程序接口(Application Binary Interface (ABI) for the ARM Architecture) 在计算机中,应用二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序的低级接口. 涵盖了数据类型的大小、布局和对齐,调用约定• EABI: 嵌入式ABI嵌入式应用二进制接口指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约定。• Arm-none-gnueabi-linux比arm-linux-gcc要好,在可移植性、兼容性上面• 早期u-boot和Linux编译可能使用的都不是一个arm-linux-gcc版本安装• $ apt install gcc-arm-linux-gnueabi
• $ apt install g++-arm-linux-gnueabi1.7、其他1、curses库–libncurses5-dev–游标移动及屏幕的显示2、我们在ubuntu上编译程序,不是说有了gcc就行了,需要先apt-get install build-essential,这个包提供了很多编译相关的软件包,里面有:dpkg-dev fakeroot g++ g++-4.6 libalgorithm-diff-perl
libalgorithm-diff-xs-perl libalgorithm-merge-perl
libdpkg-perl libstdc++6-4.6-dev libtimedate-perl3、(工具链:一般由编译器、连接器、解释器和调试器组成)gcc-arm-none-eabi是GNU项目下的软件,是一个面向裸机arm的编译器2、QEMU安装及A9开发板配置介绍• 自动安装•$ apt install qemu• 手动编译安装• 首先安装QEMU编译依赖的包– apt install zlib1g-dev
– apt install libglib2.0-0 libglib2.0-dev
– apt install libsdl1.2-dev
– apt install libpixman-1-dev libfdt-dev• 下载QEMU源码:git clone git://git.qemu-project.org/qemu.git
git branch -a分支 git checkout remotes/origin/stable-2.8 -b stable-2.8标签 git tag• 切换到一个稳定版本:git checkout v2.7.0• 编译配置:./configure –target-list=arm-softmmu –audio-drv-list=• 编译安装:make ; make install使用查看qemu 支持的开发板子qemu-system-arm -M help3、编译、运行Linux内核• 下载Linux内核– www.kernel.org
– git clone
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/• 修改Makefile• ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-• 编译内核、模块、dtb文件• makevexpressdefconfig;makezImage∙makevexpressdefconfig;makezImage•make modules; make dtbs• 运行内核qemu-system-arm -M vexpress-a9 -m 512M -kernel arch/arm/boot/zImage -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb -nographic -append “console=ttyAMA0”
qemu-system-arm -nographic -M vexpress-a9 -m 1024M -kernel arch/arm/boot/zImage -append “rdinit=/linuxrc console=ttyAMA0 loglevel=8” -dtb arch/arm/boot/dts/vexpress-v2p-ca9.dtb4、使用busybox制作根文件系统什么是根文件系统?• 文件系统• 对存储设备上的数据进行组织的机制为什么要使用文件系统• Linux的哲学:一切皆文件• 用户与操作系统进行交互的主要工具:文件系统调用• 用户和底层存储的接口根文件系统• Linux内核启动后第一个挂载的文件系统• 主要由基本的shell命令、各种库、字符设备、配置脚本组成• 提供了根目录/• RFS可以放在:nor/nand flash、SD卡、磁盘、网络空间上编译安装• 下载源代码:http://www.busybox.net/downloads/• 修改Makefile:ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-• 配置:make defconfig ; make menuconfig• 编译:make• 安装:make install制作根文件系统• mkdirrootfs∙mkdirrootfs• mkdir rootfs/lib
• cp–rinstall/∗rootfs∙cp–rinstall/∗rootfs• cp -p /usr/arm-linux-gnueabi/lib/* rootfs/lib
• mkdir−prootfs/dev/∙mkdir−prootfs/dev/• mknod –m 666 tty1 c 4 1
• mknod–m666tty2c42∙mknod–m666tty2c42• mknod –m 666 tty3 c 4 3
• mknod–m666tty4c44∙mknod–m666tty4c44• mknod –m 666 console c 5 1
• $ mknod –m 666 null c 1 3制作SD卡文件系统镜像• 生成镜像:dd if=/dev/zero of=rootfs.ext3 bs=1M count=32• 格式化为exts文件系统:mkfs.ext3 rootfs.ext3• 将各种文件拷贝到文件系统镜像中:• mount−text3rootfs.ext3/mnt/−oloop∙mount−text3rootfs.ext3/mnt/−oloop• cp -r rootfs/* /mnt• $ umount /mnt• 启动内核,挂载rootfs• $ qemu-system-arm -M vexpress-a9 -m 512M -dtb ./vexpress-
v2p-ca9.dtb -kernel ./zImage -nographic -append
“root=/dev/mmcblk0 rw console=ttyAMA0” -sd rootfs.ext3• 图形化启动内核• $ qemu-system-arm -M vexpress-a9 -m 512M -dtb ./vexpress-
v2p-ca9.dtb -kernel ./zImage -append “root=/dev/mmcblk0 rw
console=tty0” -sd rootfs.ext3
mkdir etc/init.d
touch etc/init.d/rcS
chmod a+x rcS
vi rcS5、使用u-boot加载Linux内核• 5.1、嵌入式启动概述• 5.2、U-boot编译• 5.3、QEMU网络功能设置• 5.4、内核配置编译• 5.5、主机TFTP工具安装• 5.6、启动测试• 5.7、自动化引导5.1、嵌入式启动概述嵌入式bootloader• 功能类似于PC的BIOS、硬件检测是否正常• 加载操作系统镜像到RAM• 设置不同的启动方式常见的启动方式• NOR/NAND flash启动• 从SD卡启动• Bootloader从网络加载Linux内核启动5.2、U-boot编译• 功能类似于Windows的BIOS• 编译u-boot• 下载: http://ftp.denx.de/pub/u-boot/• 修改Makefile:ARCH=arm CROSS_COMPILE=arm-linux-gnueabi-• 配置:makevexpressca9x4defconfig∙编译:makevexpressca9x4defconfig•编译: make –j4• 运行u-boot•qemu-system-arm -M vexpress-a9 \
-kernel u-boot \
-nographic \
-m 512MQEMU网络功能设置• 配置QEMU与主机的网络连接• 采用桥接(bridge)的网络连接与Host通信• 需要主机内核tun/tap模块支持• 配置• 主机安装工具包: apt install uml-utilities bridge-utils• 创建tun设备文件:/dev/net/tun• 修改/etc/network/interfaces文件,重启生效:• # interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto ens33
auto br0
iface br0 inet dhcp
bridge_ports ens33• 配置/etc/qemu-ifup、/etc/qemu-ifdown脚本/etc/qemu-ifup与/etc/qemu-ifdown,是kvm启动后将网卡在宿主主机上配置的脚本文件,我的archlinux没有这个脚本自己写了一个,直接上代码/etc/qemu-ifup:
#! /bin/sh
switch=br0
ifconfig $1 up
#ip link set $1 up
brctl addif ${switch} $1
/etc/qemu-ifdown:
#! /bin/sh
switch=br0
brctl delif ${switch} $1
ifconfig $1 down
#ip link set $1 down
#tunctl -d $1
其中$1是虚拟机传入的参数内核配置编译• 使用U-boot引导内核镜像• 需要将内核编译为uImage格式• 需要指定uImage的加载地址• 编译时指定:$ make LOADADDR=0x60003000 uImage -j4主机TFTP工具安装• 安装主机Host的TFTP• 1)安装tftp工具:$ apt-get install tftp-hpa tftpd-hpa xinetd• 2)修改配置文件: /etc/default/tftpd-hpaTFTP_USERNAME=”tftp”
TFTP_DIRECTORY=”/home/tftpboot”
TFTP_ADDRESS=”0.0.0.0:69”
TFTP_OPTIONS=”-l -c -s”• 3)创建tftp目录:mkdir/home/tftpboot;chmod777tftpboot∙4)重启tftp服务:mkdir/home/tftpboot;chmod777tftpboot•4)重启tftp服务: /etc/init.d/tftpd-hpa restart自动化引导• 修改include/configs/vexpress_common.h• #define CONFIG_BOOTCOMMAND \
“tftp 0x60003000 uImage;tftp 0x60500000 vexpress-v2p-ca9.dtb; \
setenv bootargs ‘root=/dev/mmcblk0 console=tty0’; \
bootm 0x60003000 - 0x60500000; ”• 配置开发板、主机IP地址/Netmask/
196 #define CONFIG_IPADDR 192.168.244.128
197 #define CONFIG_NETMASK 255.255.255.0
198 #define CONFIG_SERVERIP 192.168.244.1296、挂载NFS文件系统• 主机HOST支持NFS服务• 修改bootargs启动参数• • • 设置NFS为根文件系统• • • 设置主机NFS文件系统的地址• 内核支持挂载NFS文件系统安装$ apt install nfs-kernel-server配置NFS• 在/etc/exports文件中添加:/work *(rw,sync,no_root_squash,no_subtree_check)开启NFS服务• /etc/init.d/rpcbindrestart∙/etc/init.d/rpcbindrestart•/etc/init.d/nfs-kernel-server restart安装FTP:sudo apt-get install vsftpd openssh-server nfs-kernel-server portmap配置 FTP 服务修改 vsftpd 的配置文件/etc/vsftpd.conf,将下面两行前面的“#”号去掉。#local_enable=YES
#write_enable=YES上面第一行表示是否允许本地用户登录,第二行表示是否允许上传文件。修改完华之后,执行以下命令重启 ftp 服务:sudo /etc/init.d/vsftpd restart修改bootargs启动参数:修改BOOTCOMMAND(hhbf.h中)#define CONFIG_BOOTCOND \
"tftp 0x60003000 uImage;tftp 0x60500000 vexpress-v2p-ca9.dtb;\
setenv bootargs
'root=/dev/nfs rw\
nfsroot=192.168.244.129:/homg/rootfs init=/linuxrc \
ip=192.168.244.128 console=ttyAMA0';\
bootm 0x60003000 - 0x60500000
"内核make menuconfig配置内核支持挂载NFS文件系统File systems –>完善根文件系统:• 增加内核的各种用户接口• 重启reboot功能步骤:• 新建etc目录• • • 添加inittab、 init.d/rcS、 fstab、 profile• 新建tmp、 sys、 var、 proc目录• 启动Linux,挂载NFS文件系统四个文件的启动流程• Linux内核启动之后,挂载NFS根文件系统• 开启Linux的第一个用户进程: init• init进程bootargsinit=…执行inittab脚本• inittab脚本首先会执行init.d/rcS脚本• rcS脚本:执行mount –a 读取fstab挂载各种文件系统• inittab:接着会启动console• • • 启动shell: /bin/sh• • • 在启动/bin/sh之前先执行profile文件7、在虚拟开发板上开发应用程序、驱动示例
【一、玩转shell命令】Linux常用shell命令(及相关知识)详解与用法演示(三)
五、查找及检索相关命令(1)find查找① 按名称查找-name 选项,比如查找所有C文件,可以用 * 适配名称。② 按类型查找-type 选项,这里的类型是指 f 普通文件 d 目录 ,可通过man查看。比如查找所有目录文件:③ 按大小查找-size 选项,比如查找大于0M,小于3M的文件④ 指定最深路径-maxdepth(2)-exec、-ok选项和xargs① -exec 选项exec函数族会在Linux进程编程讲解,这里使用exec是把前面的执行结果传给后面的指令去执行,比如我们执行这样一条命令:find -maxdepth 1 -size -1M -exec ls -l {} \;这个命令的意思是,递归一层子目录查找小于1M的文件并显示详细信息 ,exec的作用是把 find -maxdepth 1 -size -1M 指令的结果传递给后面的指令 ls -l 去执行。② -ok 选项find -maxdepth 1 -size -1M -ok ls -l {} \;-ok和 -exec 的作用一样,都是把前面指令的结果传递给后面的指令去执行,只不过 -ok 是一种安全模式,每一条都会询问。这个选项在删除时应优先使用,可以防止误删重要文件。find -maxdepth 1 -size -1M -ok rm -r {} \;③ 使用管道 |管道配合xargs实现查找并显示详细信息find -maxdepth 1 -size -1M | xargs ls -l这里注意,exec是把前面的结果一下子全部传给后面去执行,如果前面的结果太多,可能会造成后面指令溢出,使用xargs会把前面的结果分成很多部分,按块传给后面的指令。(3)grep筛选① 筛选信息比如在aa目录及所有子目录中筛选"main",并显示"main"所在的行号② cat 3.c | grep main 查看3.c文件并筛选出main② cat 3.c | grep -v main 查看3.c文件并排除出main可以看到,在查看3.c文件的同时把 int main() 这句话排除掉了。③ 搭配find使用比如查找普通文件并且筛选出txt类型的文件六、压缩文件管理相关命令(1)zip压缩与unzip解压zip和unzip命令对应的是 .zip 类型的压缩包。zip -r 压缩并递归压缩子目录,比如zip -r 1.zip aa 1111.txt会把aa以及aa的所有子目录和1111.txt一块压缩为1.zip。压缩后得到一个 .zip 压缩文件解压命令unzip 1.zip(2)gzip压缩和gunzip解压gzip和gunzip命令对应的是 .gz 类型的压缩包,它的特点是只能压缩文件,不能压缩目录。(3)tar命令这是最常用的压缩解压缩命令,推荐优先使用。① 首先介绍选项参数:-c 压缩文件-x 解压文件-f 指定压缩文件名-v 显示信息-z 压缩为 .gz 格式,默认压缩为 .tar 格式② 压缩一个文件③ 压缩为gz格式并解压因为 -v 的存在,在压缩时会显示压缩信息。解压gz文件④ -j 压缩为bzip2 格式(4)rar压缩包a 压缩x 解压缩rar a -r 1111 1111.txt把1111.txt压缩为1111并自动添加后缀名。rar x 1111解压压缩包。七、软件安装与卸载命令(1)apt-get命令需要连网并直到软件名,用于Ubuntu等#安装tree软件
apt-get install tree
#卸载tree软件
apt-get remove tree
#更新源,即更新/etc/apt下的sources.list文件
sudo apt-get update
#清理包
sudo apt-get clean(2)yum命令如果是CentOS操作系统,要用 yum 命令安装软件,同样需要连网,直接通过软件名下载安装。如果遇到这个错误,可以通过命令行输入下面的命令解决sed -i.old -e 's/^mirrorlist/#mirrorlist/g' -e 's/^#baseurl=http:\/\/mirror.centos.org\/centos\/$releasever\//baseurl=http:\/\/vault.centos.org\/centos\/6\//g' /etc/yum.repos.d/CentOS-Base.repo
yum clean all具体请见第二章,(1)tree命令安装及使用,有详细说明。#安装软件
yum install tree
#卸载软件
yum remove tree(3)dbkg根据安装包安装dbkg 命令不需要连网,只要有 deb 安装包即可#根据安装包安装软件
sudo dbkg -i tree.deb
#移除软件包
sudo dbkg -r tree.deb(4)源码安装一般步骤如下:① 解压源码包;② cd dir 进入目录;③ ./configure 执行配置文件,检测文件是否缺少,创建Makefile,检测编译环境;④ make 编译源码,生成可执行文件和库;⑤ sudo make install 执行安装;⑥ sudo make distclean 删除与卸载软件;八、进程管理与网络命令1. 进程管理命令更多进程的信息将会在进程编程篇讲解。(1)who查看登陆设备查看登陆设备(2)ps查看进程信息ps aux 和 ps ajx(3)kill杀死进程#pid表示进程号
kill -9 pid(4)env环境变量(5)top查看系统信息按 q 键退出2. 网络命令(1)ifconfigifconfig是我们最常用的网络命令之一,可以查看IP等信息,其中 eth0 表示本地第一块网卡。图中标出的就是本机的IP,如果需要远程登陆本机或者与本机通信就用这个IP。(2)ping这也是一个常用的网络命令,可以测试网络是否连通,可以直接加域名测试网络是否连通下面一直在发东西,说明网络连通了,但是他会一直发,除非手动 ctrl+c 终止,或者通过 -c 选项限制次数,比如只ping4次,4次后他就会自动停止也可以ping一个IP,来测试两台主机是否连通ping 192.168.80.0(3)nslookup通过域名得到IP(4)netstat查看网络连接状态九、用户管理命令1、用户管理这里的命令都要加 sudo 管理员权限(1)useradd增加用户选项:-g :指定组-d :指定用户家目录-m :家目录不存在时自动创建我们现在增加一个用户Q(2)groupadd增加组增加一个Q用户组sudo groupadd Q(3)passwd设置密码passwd修改密码(4)su切换用户将root用户切换为新建的Q用户,并使用 whoami 查看当前用户,可以看到 @ 前面的root也变成了Q,说明现在是Q用户。切换到用户Q并带有环境变量sudo - Q切换到root用户sudo su如果在做这些操作的时候不是在root用户下,那么就要输入密码进行操作。(5)userdel删除用户#删除用户Q
sudo userdel Q
#删除用户Q以及它的家目录
sudo userdel -r 2、关机命令关机开机挺麻烦的,这里的命令就不演示了,直接摆上命令。(1)shutdown关机立即关机shutdown -h now(2)poweroff关机poweroff(3)init 0关机init 0(4)reboot重启reboot总结Linux基础命令篇结束,Linux命令要多用多查,学习Linux命令最好的资料就是man,学会如何有效利用man会大大提高Linux的水平,能够快速查找到最权威的一手资料。
【一、玩转shell命令】Linux常用shell命令(及相关知识)详解与用法演示(二)
三、文件相关命令1. 文件操作命令(1)touch创建文件touch+不存在的文件名,创建一个文件。如果touch后面是一个已经存在的文件,那么将会更改文件的最后访问时间。(2)rm删除文件Linux下一切皆文件!删除目录的时候一般要加上 -r 选项,表示递归删除子目录(因为Linux中的目录是树状的)-f选项表示强制删除rm -rf *这条命令表示强制删除当前目录的所有内容( * 适配任意个字符)。删除多个文件,直接在rm命令后写上多个文件的文件名即可rm -f 1.c 2.c 3.c更多的选项可以通过 man rm 查看。(3)cp拷贝命令cp命令的使用要分为几种情况:目标文件存在和目标文件不存在;目标文件是文件还是目录;① 首先目标文件不存在的情况,会直接把源文件拷贝一份并命名为目标文件名;② 目标文件已存在,源文件会覆盖目标文件,并重命名为目标文件名;③ 目标文件是目录,会把源文件拷贝到目标目录中,如果源文件目录有子目录,需要加 -r选项递归拷贝子目录。(4)mv文件移动和cp命令一样,也要考虑情况:① 目标文件不存在,相当于给源文件重命名,和cp的区别是,cp之后源文件依然存在,但是mv之后源文件就没了。② 目标文件存在,将覆盖目标文件,并且源文件消失(区别于cp命令)③ 目标文件为路径,会将源文件移动到目标路径下面。2. 文件内容相关(1)cat查看内容查看文件的内容,加 -n 选项可以显示行号。(2)more按屏查看内容more可以只显示一屏的文件内容,并且在屏幕下方会显示百分比,按enter将一行一行的滚动翻页,按空格可以一屏一屏的滚动翻页,当显示到100%会自动结束,more不能向上翻页。(3)less按屏查看less比more功能更多一些,less可以使用上下键翻页,每次滚动一行,enter按行向下滚动,空格按屏向下滚动,上键按行向上滚动(more不可以上翻),并且less显示到末尾不会自动退出,按q键手动退出。(4)head查看文件头部如果不加选项参数,默认显示文件的前十行,通过 -n选项可以指定显示行数(5)tail查看文件尾部如果不加选项参数,默认显示文件的后十行,通过 -n选项可以指定显示行数tail通常的用法是通过 -f 选项一直显示文件尾,通过该选项可以不停的显示文件尾部信息,如果文件尾部信息发生变化,那么tail会立马显示出来,通过 tail -f 可以用于追踪日志变化,比如在通信中,我们通过日志打印连接情况,这样就可以在终端不停的显示最新的连接情况。通过SecureCRT克隆会话功能,可以实现一个会话用于通信中的各种操作,另一个会话通过 tail -f 追踪日志变化。3. 文件权限与用户属性当我们使用 ls -l 查看详细信息的时候,会看到文件的详细信息,每部分的含义请看下图说明:目录都是具有可执行权限的,如果把目录权限修改为不可执行,那么目录将无法进入;目录大小一般都是4096字节,也就是4kb。文件类型介绍:文件类型含义d目录文件-普通文件l软连接(符号链接)b块设备ppipe管道设备s本地套接字c字符设备文件权限介绍权限含义r读权限w写权限x执行权限权限位是按照 读权限-写权限-执行权限 顺序排列的,第一位表示读权限,有则写 r,无则为 - ;第二位是写权限,有则写 w ,无则为 - ;第三位是执行权限,有则写 x ;无则为 - 。对应的权限位数字表示法为,有权限为1,无权限为0。下面举例说明:(1)umask查看8进制文件掩码umask可以查看文件权限的掩码,那么什么是权限掩码呢?这应该分文件和目录两种情况来考虑,因为二者的默认权限是不同的。① 目录以上面看到的aa目录为例,它的权限为 rwxr-xr-x 用数字表示是0755,那么用umask查看它的8进制权限掩码为0022目录默认的满权限为0777,用掩码0022对满权限0777取反得0755,再用0755&0777,得到0755这就是目录aa的权限。或者直接 0777-0022=0755 也可。② 文件文件默认满权限是0666,所以应将文件掩码对0666取反再相与,或0666减去掩码,比如文件3.c,0666-0022=0666 对应 rw-r–r–。4. 修改用户权限我们在命令行的时候可以看到最前面有一个 # 或者 $ 他们分别代表超级用户root和普通用户。# :超级用户root,管理员用户$:普通用户我的前面是一个 # 说明我当前用的是root超级用户。我们通常会有用户和用户组,用户组的存在方便了对用户的管理,比如对一个文件,我给某个用户组相应权限,其他用户没有权限,那么这个用户组就可以方便的对文件进行相应操作。注意,root是超级用户,它不属于任何一个组,且具有最高权限。(1)whoami我是谁查看当前用户(2)chmod修改用户权限① 直接增删权限chmod [u/g/o/a] [+/-] [r/w/x]u:用户,修改当前用户的权限g:组,修改当前用户组的权限o:其他用户,修改其他用户的权限a:所有用户,修改所有用户权限+:增加权限-:去除权限r:读权限w:写权限x:执行权限通过上面的组合来达到修改权限的目的。举例:比如上面的1111.txt文件,我们要去除它的用户写权限,应该使用的命令组合是chmod u-w 1111.txt然后我们要给所有用户增加写权限,应使用chmod a+w 1111.txt② 使用8进制数字权限修改文件权限比如,我们给1111.txt当前用户和用户组只有写权限,无读权限,无可执行权限,其他用户没有任何权限,那么这个权限的8进制数字表示为 0220,可以使用命令chmod 0220 1111.txt可以看到,1111.txt原先的 rw-rw-rw- 变成了 -w–w----。第一种方法适用于对一个用户(或用户组)增减删除某个权限,如果需要要修改的权限位比较多的话,使用8进制数字修改更为方便。(3)chown修改文件归属用户需要管理员权限sudo chown qq:qq1 1111.txt该命令是让1111.txt归属于qq用户组的qq1用户。(4)chgrp修改文件所属组需要管理员权限sudo chgrp qq2 1111.txt该命令是让1111.txt归属于qq2用户组。5. 软链接和硬链接首先介绍以下什么是软链接,什么是硬链接。① 硬链接硬链接是指通过索引节点来进行链接。在Linux文件系统中,存放在磁盘中的文件都会有一个索引节点号(inode index),硬链接就是多个文件名对应同一个索引节点,硬链接就是指向一个磁盘文件的有效路径名,硬链接文件和源文件是同一个文件。② 软链接软链接也叫符号链接,它是一个文件,文件中保存了指向文件的位置信息。通过 ll 命令查看源文件,软链接和硬链接如上图所示,可以看到硬链接和源文件大小一致,而软链接不同,并且在软链接后面还有个箭头标志 -> 指向了源文件。并且可以看到硬链接和源文件的链接数都是2,而软链接的链接数是1。实际上,对于软硬连接的本质可以这么理解:软链接其实是新建立了一个文件,会新建一个inode节点,这个文件保存了源文件的位置,也就是指向了源文件,你可以把它理解为Windows下面的快捷方式,或者理解为C语言中的指针,如果删除软链接,源文件不会受到任何影响,因为软链接和硬链接是两个不同的文件,但是如果删除源文件,虽然软链接不会受影响,但是他就失去了意义,可以对比C语言指针去理解。硬链接不会建立新的inode节点,和它源文件是同一个文件,只是将链接计数加1,所以硬链接不可以跨文件系统,可以把硬链接理解为C++中的引用,如果我们修改了源文件,那么硬链接的内容也会相应修改,软链接就是源文件的别名而已。当我们删除硬链接的时候,链接计数就会减一,当链接计数为0的时候,源文件就被删除了,对于硬链接就按照C++引用去理解。我们可以通过 ls -i 选项来查看文件i节点来验证硬链接和源文件具有相同的i节点,说明他俩是同一个文件,硬链接不会建立新的i节点,只是将链接数加1,而软链接有自己的i节点,说明软链接是一个单独的文件,和源文件不是一回事。那么硬链接和copy有什么关系呢,copy得到的是一个单独的文件,修改它对源文件无任何影响,所以硬链接和copy无任何关系,硬链接是指,两个连接引用同一块磁盘空间(拷贝是拷贝了一块内存空间,总共两个不同的空间)。(1)ln建立软硬连接建立软链接的时候要加一个 -s 选项(2)unlink删除链接unlink可以删除软链接或硬链接,unlink每次删除一个硬链接,文件的链接计数就会减1,当链接计数为0时,文件被删除(所有链接被删除,磁盘空间就无法找到了)。如果使用 rm 删除源文件,那么软链接失效,硬链接计数减1。可以看到硬链接计数减一,软链接变成红色失效了。四、查看空间占用相关命令(1)wc统计选项:-w :统计单词数-l :统计行数-c :统计字节数查看2.txt的单词数、行数、字节数分别为2、2、6。(2)du查看占用空间大小① 查看当前目录占用空间情况② 查看某一个目录占用空间情况③ -h选项,按照适合程序员观看的方式显示(显示单位K)④ 多级子目录只显示一级–max-depth=1 选项,指定子目录递归最大深度(3)df查看磁盘使用情况显示磁盘使用情况,以及按照GB单位显示更多选项可以通过man获取。
【一、玩转shell命令】Linux常用shell命令(及相关知识)详解与用法演示(一)
一、常用命令(1)tab键命令补全按一下tab键可以补全命令,如果有多个命令可以匹配,那么按两下tab键可以提示匹配的命令。比如要查看某个文件dm_exit.c,输入cat dm按两次tab键出现提示,直到唯一匹配的时候,tab键会把命令自动补全。(2)查询历史命令查询历史命令有两种方法,一个是使用history命令,第二个方法是直接按上下键。history会列出所有的历史命令,上下键是一条一条的列出上一条或下一条命令(按一次显示一条)。(3)清屏clearclear命令可以清除当前屏幕,如果使用鼠标往上滚动还是可以看到以前的输出的。(4)echo输出变量或字符串直接输出一个字符串:输出一个变量:$代表的是环境变量,下面的命令用于查看当前使用的shell是什么。(5)ls命令、Linux的目录结构、绝对/相对路径1° ls命令ls查看目录下的文件(Linux中一切皆文件)。① ls -al 显示所有文件及详细信息,隐藏文件也会显示, -l 表示显示详细信息(用户、权限、大小、时间等,将在后面命令中介绍), -a表示显示所有文件。其中 . 表示当前目录 .. 表示上一级目录,前面带一个 . 的文件都是隐藏文件,如果不加 -a 选项就无法看到,比如下面我们建一个隐藏文件,分别用不带 -a 选项和带 -a 选项查看② ls -R 选项,递归显示子目录,他会把子目录和子目录的子目录全部显示出来。③ ls -lrt 按时间顺序显示,且显示详细信息,文件会按照最后访问时间进行排序显示出来。④ 使用通配符 * 和 ?*号可以代表任意个字符,下面命令表示显示所有.c文件ls *.c?只能表示一个字符更多的选项可以通过man命令查看, man ls2° Linux目录结构目录用途/根目录bin存放了系统可执行程序boot存放了内核和启动程序的相关文件lib库目录,存放了系统的动态共享库media挂载设备媒体、U盘、光驱等,比如我们插入U盘拷贝数据的时候,U盘就会被自动识别为mediausr一般会将很多应用安装在此目录,/usr/local 用户自己安装文件的目录sbin超级管理员root的执行程序proc系统内存映射,会保留一些进程运行信息etc系统软件启动和配置目录dev设备文件目录home用户家目录,其实就是 ~3° 绝对路径与相对路径绝对路径是指 ==/==开头的路径,比如 /home/qq/dm01_cmd/使用绝对路径,不管当前目录是什么,都能根据绝对路径到达目的路径。相对路径就是以 . 开头以及 . . 开头的路径,前面说过,一个点表示当前目录,两个点表示上一级目录,比如现在dm01_cmd目录下有aa和bb两个目录,当前在aa目录中,通过 cd …/bb 就以相对路径(上一级目录的bb目录中)的方式进入了bb目录。(6)pwd查看当前目录通过pwd命令可以查看当前在那个目录。(7)man查看帮助手册man man 查看man的帮助手册,进入man帮助手册后,可以按上下键一行一行的移动,enter键和下键一样,也是按行滚动,使用空格键可以一页一页(一个屏幕)的滚动翻页。按q就可以退出man帮助手册。上面几个数字是比较有用的,比如 2 System Calls 代表系统调用,当我们查找系统调用函数的帮助手册时可以加这个参数,比如 man 2 fork 查看fork函数的帮助手册。(8)date查看系统时间,以及时间校准方法可以直接date获取时间,也可以按照自己需要的格式获得系统时间,各种格式的说明可以通过man date获得。如果你的时间不准确可以通过下面方法解决:首先安装时间同步服务,执行下面的命令yum install ntp -y然后执行下面命令即可同步网络时间ntpdate cn.ntp.org.cn再次查看时间,如果发现时间和实际时间还是不一致,应该考虑时区设置问题,查看系统时区是不是本地时区,使用vim编辑器打开 /etc/sysconfig/clockvim /etc/sysconfig/clockZONE后面显示的就是时区我们把之前的时区屏蔽,修改为本地时区,比如我所在位置为"Asia/Shanghai",然后关闭硬件时钟与UTC时间一致功能ZONE="Asia/Shanghai"
UTC=false
ARC=false设置linux时区为上海,在命令行输入ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime同步时间,如果没有ntpdate需要根据前面介绍先安装ntp服务ntpdate time.nist.gov然后在根目录下执行命令设置硬件时间和系统时间一致./sbin/hwclock --systohc再次执行date查看时间并对比本地时间,可以发现时间正常。(9)alias命令重命名或自定义命令这个命令可以帮助我们把一个很长的命令自定义为一个简短的名字,或者把一些常用的复杂操作重命名为一个方便使用的命令。查看当前已有的命令别名:自定义一个命令,比如我们学习Linux的时候,每次开机都要进入到一个存放自己练习文件的目录,我是在下面路径中,所以每次开机都要敲一遍这个路径cd /home/qq/dm01_cmd通过alias可以把它命名为一个简单的命令alias gotest='cd /home/qq/dm01_cmd'直接执行gotest就可以达到 cd /home/qq/dm01_cmd的效果这里 cd ~ 是回到家目录的意思。使用unalias可以删除命令别名可以看到别名gotest没有了。另外也可以在家目录(~目录,通过 cd ~进入)下的 .bashrc文件中进行配置(10)bc计算器bc命令可以进入计算器,进行一些简单计算,输入要计算的表达式后,按回车输出结果按 quit 退出,不能简写为q二、目录操作相关命令(1)tree命令安装及使用Linux中的目录都是树状的,一层一层的,使用tree命令可以树形显示目录,并递归显示子目录。如果没有安装过tree的话需要使用yum命令安装一下(我用的CentOS操作系统)yum install tree如果是Ubuntu系统应该使用apt-get命令sudo apt-get install tree这里提示一下,如果你使用的是CentOS 6,那么你的yum命令可能会报错错误:Cannot find a valid baseurl for repo: base这是因为CentOS 6已经停止更新了,我曾因为yum这个错误疯狂尝试各种方法,最后查资料看到CentOS 6已经停止更新,这里有一个解决方法,在shell下输入下面的命令sed -i.old -e 's/^mirrorlist/#mirrorlist/g' -e 's/^#baseurl=http:\/\/mirror.centos.org\/centos\/$releasever\//baseurl=http:\/\/vault.centos.org\/centos\/6\//g' /etc/yum.repos.d/CentOS-Base.repo
yum clean all然后再次使用yum命令就发现yum可以正常使用了。这时可以安装tree了yum install treetree命令可以看到目录的层级结构,非常好用。(2)cd切换目录① 有关目录的一点小知识一般来说我们在命令中写路径的时候都会在后面加一个 / ,比如我们写一条切换到某路径的命令cd /home/qq/dm/dm_gcc/main/对这条命令中的目录进行分析,首先第一个 / 代表根目录, home/ 代表家目录, qq/ 代表qq目录,dm/ 代表dm目录,dm_gcc/ 代表dm_gcc目录, main/ 代表main目录,这条命令就是切换到main目录中的意思。如果我们要去上一级目录中的某个目录,应该这样cd ../header/代表去上一级目录下的header目录,其中 …/ 就表示上一级目录,如果是当前目录用 ./ ,说这些的目的是为了告诉大家,我们在写目录的时候会在后面加一个 / 来表示这是目录,大家不要写了这么多命令还不知道命令中的 / 是什么意思。有时候,如果路径只有一层,可以不加 /② 回到家目录home的4种方式cd ~
cd -
cd /home
cd $HOME(3)mkdir创建目录mkdir cc/dd 在已有目录cc下创建dd,如果当前cc目录不存在就要加一个 -p 选项,该选项的意思是递归创建目录。(4)rmdir删除目录rmdir命令只能删除空目录(只有 .. . 的目录),不能删除非空目录,非空目录要加 -p 选项递归删除子目录。如果子目录太多(目录层次太深)这个命令就不好用了,可以用rm命令删除一般使用rm比较好,因为他还用于删除文件,在后面会详细介绍。(5)which查看路径which可以查看一个命令所在的路径可以看到这些命令都在 /bin 目录下,但是也有例外这是因为 cd命令是BASH shell本身自带的命令,不在任何目录中。
请问老师,chaosblade有没有 支持 自定义执行shell的功能,类似例如: http://x
请问老师,chaosblade有没有 支持 自定义执行shell的功能,类似例如: http://xxxxx:10000/chaosblade?cmd=cd /data1;ls
ubuntu上安装spyder
找了好多教程,总是出现这样或者那样的问题,重新安装了一个新的ubuntu16.0.4,64位的系统,1核2G。第一,很多安装anaconda,之后打不开spyder,是因为没有安装gnome桌面环境,首先安装gnome桌面环境命令如下:sudo apt-get install gnome-shell
sudo apt-get install ubuntu-gnome-desktopsudo apt-get install gnome-tweak-tool第二步、安装anaconda使用清华的镜像,选择你要下载的版本https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/找到下载链接,如anaconda3.5.0.1下载地址如下:在ubuntu里面使用命令:wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-5.0.1-Linux-x86_64.sh下载好之后,使用以下命令进行安装bash Anaconda3-5.0.1-Linux-x86_64.sh安装好了之后,还需要自己配置以下环境,anaconda默认的配置环境似乎有问题,配置环境使用以下命令:export PATH="/root/anaconda3/bin:$PATH"这个需要根据自己的情况进行调整第三步、重启,打开python、spyder就会发现改变了,可以打开了,配置成功。在专业码农的道路上越走越远(_*_)
云效流水线基于标签功能实现阿里云ECS多环境发布
在软件开发和部署过程中,我们的软件往往需要在不同的运行环境中运行,例如:开发人员本地开发环境、测试团队的测试环境、还有类生产环境和生产环境。在整个研发流程的过程中,针对开发和运维,前者面向需求和代码,后者面向资源和环境,而部署,是两者都会关注的部分。通过本文,你可以了解到,如何通过云效流水线有效拉通开发与运维,打破二者之间的壁垒墙,让开发与运维高效联动。一、用户诉求一般来说,用户使用主机部署诉求如下:1、 开发人员不需要关注资源变更,只需要按需选择环境进行部署即可。2、 开发人员能够根据制定好的发布策略,自主发布,不需要手工配置和干预。3、 运维人员不需关注研发平台,只需做好资源的规划管理即可。该场景下主要会涉及开发人员跟运维人员两个角色,下面文章中我们主要会这两个角色角度进行讲解。二、云效解决方案结合云效交付流水线发布策略及ECS的标签功能,为ECS的多环境发布提供了很好的基础保障,如图:三、云效操作实践接下来以一个 Java Spring Boot 的代码库为例,讲解如何通过云效流水线进行阿里云 ECS 的多环境发布。前置条件1、 运维人员已购买相应阿里云ECS资源,并配置好相应环境,如本文案例中需要的JDK环境。购买ECS参考链接:https://ecs-buy.aliyun.com/2、 运维人员,根据需要,对相应ECS资源进行标签配置。标签是云资源的标识,可以帮助您从不同维度对具有相同特征的云资源进行分类、搜索和聚合,让资源管理变得更加轻松。本文中ECS资源及标签设置如图所示:标签键: environment 标签值:dev、sit、product 创建流水线1、 进入云效流水线(https://flow.aliyun.com/my?channel=yy_rccb )。2、点击右上角【新建流水线】,进入流水线创建向导页面。3、选择图中标识模板,并点击创建配置代码库创建流水线之后会自动弹出添加代码源的窗口,这里选择Flow提供的示例代码源,并进行添加配置构建上传任务修改一下”Java构建上传“的任务,增加一个打包路径,填入deploy.sh。这个文件存在于代码库中,其中包含了在ECS上进行应用启动的脚本,为了进行后续的主机部署,需要将这个文件也打入到压缩包中,在后续的主机部署任务中可以看到如何使用该deploy.sh。在该配置中指定了target/和deploy.sh两个路径,所以Flow会将这两个文件(夹)打包成为一个压缩包,并进行归档,在Flow中我们称之为制品,该制品也会在后续的主机部署任务中用到。配置部署任务接下来配置主机部署任务,在制品下拉框中选择”制品名称.default”,也就是前面的”Java构建上传“步骤归档的那个制品。为了配置主机组,需要先创建一个,点击”新建主机组”。选择”阿里云ECS“,点击”新建服务授权”,跳转到阿里云,完成RAM授权,然后会自动跳回到Flow。此时再选择标签方式添加,依次选择地区、ECS标签键、ECS标签值,点击下一步。在新弹出的页面中输入主机组名称及主机组环境,点击保存即可。接下来进行部署脚本的配置:• 下载路径:表示希望把”构建上传”任务中的压缩包下载到机器上的什么位置,在本例的值为:/home/admin/app/package.tgz• 执行用户:希望以是哪个用户的身份进行脚本执行,本例的值为:root• 部署脚本:在机器上执行脚本的具体内容,本例的值为:mkdir -p /home/admin/application/tar zxvf /home/admin/app/package.tgz -C /home/admin/application/sh /home/admin/application/deploy.sh restart部署策略配置• 暂停方式:希望一个主机组中的机器以什么样的暂停方式进行,比如第一批暂停,每批暂停,或者不暂停。推荐使用第一批暂停,在发布完第一批之后,对线上服务进行观察,如果没有异常,则可以继续其余批的发布• 分批数量:希望主机组中的机器分为几批进行发布。比如一共4台机器,分两批,则每批同时发布2台机器。本文中配置如下所示:部署结果查看• 点击右上角保存并执行按钮• 待执行完毕后,点击部署详情按钮查看部署明细。• 通过IP:8080访问验证,如下图所示:资源变更场景因业务需要,需在开发环境中增加一台机器,运维同学只需在ECS侧准备相应资源,打上相应环境标签即可,如下图所示。运维同学配置完毕后,开发同学不需做任何变更,直接运行相应环境流水线即可。流水线运行过程中,因为我们之前设置的分批,第一批暂停的发布策略,因此流水线会暂停,出现如下状态此时点击部署详情按钮,进入部署详情页面,确认没有问题后,点击继续按钮,如下图所示 五、结语通过以上的操作流程,我们可以通过云效流水线,利用标签功能,拉通开发与运维,同时,让开发和运维关注点分离,专注于核心的工作内容,实现ECS的多环境部署。欢迎体验、试用云原生时代新DevOps平台阿里云云效。
3天玩转shell--7.awk编程技巧一
一、这节课掌握如下几个知识点【1】掌握awk的字符分隔【2】掌握awk字符匹配的用法【3】掌握awk流程控制的if判断【4】掌握awk编程的循环for、while二、代码讲解先根据附件中的文档创建7.example.txt的测试文件。#!/bin/bash
#7.sh v1
PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
export LANG=zh_CN.UTF-8
export PATH
#1.文件中某一列的字符提取及字符切割
#$0-$NF 从第一列到最后一列
sed -n '1,3p' 7.example.txt #用sed将文件中的1到3行过滤出来
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '{print}' #用sed将文件中的1到3行过滤出来并通过awk全部打印
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '{print $0}' #用sed将文件中的1到3行过滤出来打印第1列
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '{print $1}'#用sed将文件中的1到3行过滤出来打印第2列
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '{print $2}' #用sed将文件中的1到3行过滤出来打印第3列
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '{print $NF}'#用sed将文件中的1到3行过滤出来打印最后一列
echo "=================-F 切割参数"
awk -F '[ :]' 表示既可以是空格,也可以是冒号进行分隔
sed -n '5,7p' 7.example.txt #用sed将文件中的5到7行过滤出来
echo "--------------"
sed -n '5,7p' 7.example.txt|awk -F "," '{print $2}' #用sed将文件中的5到7行过滤出来并进行逗号切割后,打印第二列
echo "--------------NR 表示输入的行数"
sed -n '9,11p' 7.example.txt|awk -F ",|;" '{print $2}'#用sed将文件中的9到11行过滤出来并进行逗号,竖线,分号切割后,打印第二列
echo "--------------"
sed -n '9,11p' 7.example.txt|awk '{print NR}' #用sed将文件中的9到11行过滤出来并用awk输出行号
#2.字符串匹配
echo "=================="
sed -n '13,17p' 7.example.txt #用sed将文件中的13到17行过滤出来
echo "--------------"
sed -n '13,17p' 7.example.txt|awk '/yidong2/' #用sed将文件中的13到17行过滤出来,并将匹配yidong2的行打印出来
echo "--------------"
sed -n '13,17p' 7.example.txt|awk '/yidong2/{print $2}' #用sed将文件中的13到17行过滤出来,并将匹配yidong2的行打印第二列
echo "--------------"
sed -n '13,17p' 7.example.txt|awk '$1 ~ /10010/{print $2}' #用sed将文件中的13到17行过滤出来,并将第一列匹配到10010的行打印第二列
echo "--------------"
sed -n '13,17p' 7.example.txt|awk '$1 ~ /\<10010\>/{print $2}' #用sed将文件中的13到17行过滤出来,并将第一列绝对匹配10010的行打印第二列
echo "--------------"
sed -n '13,17p' 7.example.txt|awk '$1 ~ /10010/ && $NF ~ /liantong2/{print $2}'
#用sed将文件中的13到17行过滤出来,并将第一列匹配10010,和最后一列匹配liantong2的第二列打印出来
#3.awk中使用if判断
echo "=================="
sed -n '1,3p' 7.example.txt
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '$2>=30{print}' #用sed将文件中的1到3行过滤出来,并将第二列大于等于30的行打印出来。
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '$2>=30{print $1,$2}' #用sed将文件中的1到3行过滤出来,并将第二列大于等于30的行,然后将第一列、第二列打印出来。
echo "--------------"
sed -n '1,3p' 7.example.txt|awk '($2>=30)&&($1~/wang/){print $3}' #用sed将文件中的1到3行过滤出来,并将第二列大于等于30的行,并且第一列匹配wang的行匹配出来并打印第三列
echo "--------------"
sed -n '19,22p' 7.example.txt
echo "--------------"
sed -n '19,22p' 7.example.txt|awk '{if (NR%2==0){print $0} else {printf "%s ",$0}}' #用sed将文件中的19到22行过滤出来,并将偶数列和奇数列分别打印不同的信息
echo "--------------"
sed -n '24,27p' 7.example.txt|awk '{ if(NR==2){print $0/4} else if(NR==4){print $0/3} else {print} }' #用sed将文件中的24到27行过滤出来,并将第二行的第一列除4,第四行的第一列除3,其余的全部打印。
#4.awk中使用循环for,while
echo 5 6 7 8|awk '{ for (i=1;i<=NF;i++) { if ($i>6) {print $i} } }' #循环判断5678,并打印大于6的值
echo 5 6 7 8|awk '{for (i=1;i<=NF;i++) { sum+=$i }; {print sum} }' #将5678求和
sed -n '24,27p' 7.example.txt|awk '{N+=$1} END {print N/NR}' #用sed将文件中的24到27行过滤出来,并求第一列数据的平均数
sed -n '24,27p' 7.example.txt|awk 'BEGIN {max = 0} {if ($1+0 > max+0) max=$1 fi} END {print max}' #用sed将文件中的24到27行过滤出来,并求第一列的最大值
#awk默认按照字符串比较的,如果要比较数值,需要先强制类型转换,即 $1+0,转换成整数。
sed -n '24,27p' 7.example.txt|awk 'BEGIN {min = 65535} {if ($1+0 < min+0) min=$1 fi} END {print min}' #用sed将文件中的24到27行过滤出来,#求最小值
awk 'BEGIN{ test=100; total=0; while(i<=test) { total+=i; i++; } print total; }' #求1-100的累加
awk 'BEGIN{ total=0; i=0; do { total+=i; i++; }while(i<=100) print total; }' #求1-100的累加三、课程附件附件1:7.example.txtxiaoming 23 1500
xiaodong 32 2300
xiaowang 43 3200
===========
xiaoming,23,1500
xiaodong,32,2300
xiaowang,43,3200
===========
xiaowang,43;3200
xiaowang;43,3200
xiaowang,43,3200
=========ƥӡ=
10086 cmc yidong
100860 ccc yidong2
10010 cnc liantong
100101 ccc liantong2
10000 ctc dianxing
==========if һ=
192.168.1.17
down
192.168.1.103
open
=======if-else===
125
32
126
54
==========
cc 750
aa 181
bb 37
bb 725
aa 42
cc 72
=====BEGIN END====
one:16.32
two:13.28
three:15.65
【Linux】进程程序替换及shell的模拟实现(下)
用 C语言程序调用 C++ 的程序用 C语言程序调用 python 的程序可以使用程序调换,调用任何后端语言对应的可执行程序!5. execleint execle(const char *path, const char *arg, ...,char *const envp[]);传入自定义环境变量传入系统的环境变量execle 函数能够传入环境变量,但是我们发现传入系统环境变量,就不能传入自定义环境变量了。如果我们先要两个都有的话,就可以借助 putenv 函数了。当使用 exec 函数将程序加载到内存的时候,其在调用 main 函数之前首先调用一个特殊的例程,并且将此启动例程指定为程序的起始位置。这个启动例程将从内核取得该可执行程序的命令行参数和环境变量,然后传递给 main 函数。尽管前 4 个 exec 函数没有传环境变量,但是子进程照样能够通过 environ 拿到默认的环境变量,其是通过进程地址空间的方式让子进程拿到的!6. execveint execve(const char *path, char *const argv[], char *const envp[]);在程序替换中,execve 是系统调用。其余 6 个函数都是对 execve 系统调用做的封装,以满足开发者的需求。和 mian 函数的命令行参数结合以上就实现了用我们的程序去执行系统的程序。如果再把前面的./myexec去掉,就相当于我们自己写了个shell。那么接下来,我们就模拟实现一个简易的shell。👉shell 的模拟实现👈现在我们已经学习到了进程创建、进程退出、进程登台、进程程序替换等知识,那么我们理解这些知识模拟实现简易版的命令行解释器 shell。注:本次模拟实现的 shell 并不是十全十美的,多少会有一些 BUG。对于一些常用的命令,还是能实现的。实现思路:通常来说,shell 读取一行新的输入,对输入进行命令解析。然后创建子进程并进行程序替换执行输入的命令。但是对于一些内建(内置)命令,shell 会自己执行,而不是通过创建子进程再进行程序替换的方式。什么是内建(内置命令)?不需要创建子进程来执行,而是让 shell 自己执行的命令称为内建命令或者内置命令,其本质是调用相应的系统接口。echo 和 cd 就是常见的内建命令。因为 echo 是个内建命令,命令行解释器 bash 不会创建子进程来执行 echo 命令而是自己去执行该目录,所以 echo 能够输出不具有全局属性的本地变量。shell 的循环过程获取命令行解析命令行建立一个子进程(fork)替换子进程(execvp)父进程等待子进程退出(wait)关于 cd 为什么是内建命令,我们需要了解什么是当前路径!当前路径就是当前进程的工作路径。默认情况下,当前路径就是可执行程序所处的路径。进程的工作路径可以通过系统调用chdir来修改。如果我们创建子进程来执行 cd 命令的话,子进程执行 cd 命令改变子进程的工作路径。而子进程执行 cd 命令后就退出了,并不会改变父进程 bash 的工作路径。所以说,要想改变父进程 bash 的工作路径,就只能父进程 bash 来执行 cd 命令了。所以,cd 也是内建命令。让子进程执行 cd 命令的情况使用 chdir 修改进程的工作路径myshell 源码#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <assert.h>
#include <string.h>
#define NUM 1024
#define OPT_NUM 64 // 命令行参数的最多个数
char lineCommand[NUM];
char* myargv[OPT_NUM];
// 上一个进程的退出信息
int lastCode = 0;
int lastSignal = 0;
int main()
{
while(1)
{
char* user = getenv("USER"); // 当前登录用户
// 根据用户输出对应的提示信息, get_current_dir_name函数可以获得当前的工作路径
if(strcmp(user, "root") == 0)
{
printf("[%s@%s %s]# ", user, getenv("HOSTNAME"), get_current_dir_name());
}
else
{
printf("[%s@%s %s]$ ", user, getenv("HOSTNAME"), get_current_dir_name());
}
fflush(stdout); // 刷新缓冲区
// 获取用户输入
char* s = fgets(lineCommand, sizeof(lineCommand) - 1, stdin);
assert(s != NULL);
// 清除最后一个\n, abcd\n
lineCommand[strlen(lineCommand) - 1] = 0;
// 字符串切割:"ls -a -l" -> "ls" "-a" "-l"
myargv[0] = strtok(lineCommand, " ");
int i = 1;
// 因为无法执行"ll"指令, 所以这里做一下处理
if(myargv[0] != NULL && strcmp(myargv[0], "ll") == 0)
{
myargv[0] = "ls";
myargv[i++] = "-l";
}
if(myargv[0] != NULL && strcmp(myargv[0], "ls") == 0)
{
myargv[i++] = "--color=auto";
}
// 如果切割完毕, strtok返回NULL, myargv[end] = NULL
while(myargv[i++] = strtok(NULL, " "));
// 如果是cd命令, 不需要创建子进程来执行, 让当前进程的父进程shell执行对应的命令, 本质就是调用系统接口
// 像这种不需要创建子进程来执行, 而是让shell自己执行的命令, 称为内建命令或者内置命令
// echo和cd就是一个内建命令
if(myargv[0] != NULL && strcmp(myargv[0], "cd") == 0)
{
// 如果cd命令没有第二个参数, 则切换到家目录
if(myargv[1] == NULL)
{
chdir(getenv("HOME")); // 更改到家目录
}
else
{
if(strcmp(myargv[1], "-") == 0) // 该功能还有BUG, 因为环境变量的问题
{
chdir(getenv("OLDPWD")); // 回到上一次所处的路径
}
else if(strcmp(myargv[1], "~") == 0)
{
chdir(getenv("HOME")); // 去到家目录
}
else
{
chdir(myargv[1]); // 更改到指定目录
}
}
continue; // 不创建子进程, continue回到while循环处
}
// 实现echo命令, 当前的echo命令功能也不是很全
if(myargv[0] != NULL && myargv[1] != NULL && strcmp(myargv[0], "echo") == 0)
{
if(strcmp(myargv[1], "$?") == 0)
{
printf("%d, %d\n", lastSignal, lastCode);
}
else
{
printf("%s\n", myargv[1]);
}
continue;
}
// 创建子进程来执行命令
pid_t id = fork();
assert(id != -1);
// child process
if(id == 0)
{
execvp(myargv[0], myargv);
exit(1); // 进程替换失败
}
int status = 0;
pid_t ret = waitpid(id, &status, 0); // 阻塞等待
assert(ret > 0);
lastCode = ((status >> 8) & 0xFF);
lastSignal = (status & 0x7F);
}
return 0;
}
myshell 使用演示myshell 的源码里已经有了相应的注释,所以就不详细讲解了。我们无法做到使用 cd 命令时,使得 bash 和 myshell 的工作路径一起跟着改变。因为当你登录上 Xshell 时,操作系统已经将 bash 进程给创建好了,myshell 是 bash 的一个子进程,所以 myshell 执行 cd 命令并不会修改 bash 的工作路径。👉补充知识👈exec 和 exit 就像 call 和 return 一样。一个 C 语言程序有很多函数组成,一个函数可以调用另外一个函数,同时传递给它一些参数。被调用的函数执行一定的操作,然后返回一个值。每个函数都有他的局部变量,不同的函数通过 call 和 return 进行通信。这种通过参数和返回值在拥有私有数据的函数间通信的模式是结构化程序设计的基础。Linux 鼓励将这种应用于程序之内的模式扩展到程序之间。如下图:一个 C 语言程序可以 fork 和 exec 另一个程序,并传给它一些参数。这个被调用的程序执行一定的操作,然后通过 exit 来返回值。调用它的进程可以通过 wait 来获取 exit 的返回值。👉总结👈本篇博客主要讲解了进程的程序替换并且综合前面学到的进程创建、进程退出和进程等待的知识模拟实现了一个简易版的命令行解释器 myshell。那么以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家!💖💝❣️