• [技术干货] Linux中文件系统truncate.c详解【转】
    Linux-0.11 文件系统truncate.c详解free_ind1static void free_ind(int dev,int block)该函数的作用是释放所有的一次间接块。该函数首先读取一次间接块到bh中, 该bh块中存储了512个盘块号。1234567struct buffer_head * bh;unsigned short * p;int i;if (!block)    return;if ((bh=bread(dev,block))) {接下来就对这512个盘块号进行遍历,如果盘块号不为0, 就调用free_block(bitmap.c中)释放该盘块。遍历完毕之后,将一次间接块的bh块引用计数减1。最后将这个一次间接块也进行释放。12345for (i=0;i<512;i++,p++)    if (*p)        free_block(dev,*p);brelse(bh);free_block(dev,block);free_dind1static void free_dind(int dev,int block)该函数的作用就是释放所有的二次间接块。该函数首先对盘块号的有效性进行校验。123456struct buffer_head * bh;unsigned short * p;int i;if (!block)    return;接着读取二次间接块到bh中, 该bh块中存储了512个一次间接块的盘块号。接下来就对这512个一次间接块的盘块号进行遍历,如果盘块号不为0, 就调用free_ind释放该一次间接块所有的block。遍历完毕之后,将二次间接块的bh块引用计数减1。最后将这个二次间接块也进行释放。12345678if ((bh=bread(dev,block))) {    p = (unsigned short *) bh->b_data;    for (i=0;i<512;i++,p++)        if (*p)            free_ind(dev,*p);    brelse(bh);}free_block(dev,block);truncate1void truncate(struct m_inode * inode)该函数的作用是释放该inode所占据的磁盘空间。 该函数在iput函数(inode.c)中如果文件的链接数为0的时候被调用。代码最开始检查如果不是常规文件或者是目录文件,就跳过。1234int i;if (!(S_ISREG(inode->i_mode) || S_ISDIR(inode->i_mode)))    return;释放直接引用块。12345for (i=0;i<7;i++)    if (inode->i_zone[i]) {        free_block(inode->i_dev,inode->i_zone[i]);        inode->i_zone[i]=0;    }释放一次间接块和二次间接块。12free_ind(inode->i_dev,inode->i_zone[7]);free_dind(inode->i_dev,inode->i_zone[8]);将一次间接块和二次间接块的地址置为0。将inode的size置为0, 将该inode设置为含有脏数据, 最后将inode的修改时候和创建时间都修改为当前时间。1234inode->i_zone[7] = inode->i_zone[8] = 0;inode->i_size = 0;inode->i_dirt = 1;inode->i_mtime = inode->i_ctime = CURRENT_TIME;到此这篇关于Linux中文件系统truncate.c详解的文章就介绍到这了转载自https://www.jb51.net/article/278871.htm
  • [技术干货] CentOS/RHEL 7.6升级OpenSSH(不升级OpenSSL)
    如果只需升级OpenSSH的话可以看我的另一篇文章CentOS/RHEL 7.6升级OpenSSH(不升级OpenSSL)这里升级OpenSSL是为了解决SSL/TLS协议信息泄露漏洞(CVE-2016-2183)本文构建完成的所有RPM包:OpenSSL 1.1.1k和OpenSSH 8.5p1安装依赖yum install -y wget rpm-build zlib-devel openssl-devel gcc perl-devel pam-devel unzip libXt-devel imake gtk2-devel openssl-libs脚本构建OpenSSL 1.1.1k RPM包在写本文时最新的版本是OpenSSL 1.1.1k,如果各位读者在看本文时有更新的版本可以直接将下面脚本中的1.1.1k替换为新的版本号#!/bin/bash set -e set -v mkdir ~/openssl && cd ~/openssl yum -y install \ curl \ which \ make \ gcc \ perl \ perl-WWW-Curl \ rpm-build yum -y remove openssl # Get openssl tarball curl -O --silent https://www.openssl.org/source/openssl-1.1.1k.tar.gz # SPEC file cat << 'EOF' > ~/openssl/openssl.spec Summary: OpenSSL 1.1.1k for Centos Name: openssl Version: %{?version}%{!?version:1.1.1k} Release: 1%{?dist} Obsoletes: %{name} <= %{version} Provides: %{name} = %{version} URL: https://www.openssl.org/ License: GPLv2+ Source: https://www.openssl.org/source/%{name}-%{version}.tar.gz BuildRequires: make gcc perl perl-WWW-Curl BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root # openssldir 可以自行更改 %global openssldir /usr/local/openssl Þscription https://github.com/philyuchkoff/openssl-RPM-Builder OpenSSL RPM for version 1.1.1k on Centos %package devel Summary: Development files for programs which will use the openssl library Group: Development/Libraries Requires: %{name} = %{version}-%{release} Þscription devel OpenSSL RPM for version 1.1.1k on Centos (development package) %prep %setup -q %build ./config --prefix=%{openssldir} --openssldir=%{openssldir} make %install [ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot} %make_install mkdir -p %{buildroot}%{_bindir} mkdir -p %{buildroot}%{_libdir} ln -sf %{openssldir}/lib/libssl.so.1.1 %{buildroot}%{_libdir} ln -sf %{openssldir}/lib/libcrypto.so.1.1 %{buildroot}%{_libdir} ln -sf %{openssldir}/bin/openssl %{buildroot}%{_bindir} %clean [ "%{buildroot}" != "/" ] && %{__rm} -rf %{buildroot} %files %{openssldir} Þfattr(-,root,root) /usr/bin/openssl /usr/lib64/libcrypto.so.1.1 /usr/lib64/libssl.so.1.1 %files devel %{openssldir}/include/* Þfattr(-,root,root) %post -p /sbin/ldconfig %postun -p /sbin/ldconfig EOF mkdir -p /root/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS} cp ~/openssl/openssl.spec /root/rpmbuild/SPECS/openssl.spec mv openssl-1.1.1k.tar.gz /root/rpmbuild/SOURCES cd /root/rpmbuild/SPECS && \ rpmbuild \ -D "version 1.1.1k" \ -ba openssl.spec # For install: rpm -ivvh /root/rpmbuild/RPMS/x86_64/openssl-1.1.1k-1.el7.x86_64.rpm --nodeps # Verify install: rpm -qa openssl # openssl version构建完成后界面打印以下内容:检查未打包文件:/usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/openssl-1.1.1k-1.el7.x86_64 写道:/root/rpmbuild/SRPMS/openssl-1.1.1k-1.el7.src.rpm 写道:/root/rpmbuild/RPMS/x86_64/openssl-1.1.1k-1.el7.x86_64.rpm 写道:/root/rpmbuild/RPMS/x86_64/openssl-devel-1.1.1k-1.el7.x86_64.rpm 写道:/root/rpmbuild/RPMS/x86_64/openssl-debuginfo-1.1.1k-1.el7.x86_64.rpm 执行(%clean): /bin/sh -e /var/tmp/rpm-tmp.CdyqOD + umask 022 + cd /root/rpmbuild/BUILD + cd openssl-1.1.1k + '[' /root/rpmbuild/BUILDROOT/openssl-1.1.1k-1.el7.x86_64 '!=' / ']' + /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/openssl-1.1.1k-1.el7.x86_64 + exit 0 # For install: rpm -ivvh /root/rpmbuild/RPMS/x86_64/openssl-1.1.1k-1.el7.x86_64.rpm --nodeps # Verify install: rpm -qa openssl # openssl version 升级OpenSSL1.卸载旧版注意openssl-libs不能卸载rpm -e `rpm -qa | grep openssl | grep -v libs` --nodeps 2.安装新版# 1.确定要安装的包 cd /root/rpmbuild/RPMS/x86_64/ cp openssl* ~/openssl cd ~/openssl rm -rf openssl-debuginfo-1.1.1k-1.el7.x86_64.rpm # 2.开始安装 [root@localhost openssl]# rpm -Uvh *.rpm --nodeps 准备中... ################################# [100%] 正在升级/安装... 1:openssl-1.1.1k-1.el7 ################################# [ 50%] 2:openssl-devel-1.1.1k-1.el7 ################################# [100%] [root@localhost openssl]# openssl version OpenSSL 1.1.1k 25 Mar 20213.安装完成根据已经升级的OpenSSL制作OpenSSH包创建所需目录上面OpenSSL的脚本已经把目录建好了,如果没有的话:mkdir -p /root/rpmbuild/{SOURCES,SPECS} cd /root/rpmbuild/SOURCES下载源码包wget http://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-8.5p1.tar.gz wget https://src.fedoraproject.org/repo/pkgs/openssh/x11-ssh-askpass-1.2.4.1.tar.gz/8f2e41f3f7eaa8543a2440454637f3c3/x11-ssh-askpass-1.2.4.1.tar.gz tar -xvzf openssh-8.5p1.tar.gz tar -xvzf x11-ssh-askpass-1.2.4.1.tar.gz修改配置文件cp openssh-8.5p1/contrib/redhat/openssh.spec /root/rpmbuild/SPECS/ cd /root/rpmbuild/SPECS/ sed -i -e "s/Þfine no_x11_askpass 0/Þfine no_x11_askpass 1/g" openssh.spec sed -i -e "s/Þfine no_gnome_askpass 0/Þfine no_gnome_askpass 1/g" openssh.spec sed -i 's/BuildRequires: openssl-devel < 1.1/#&/' /root/rpmbuild/SPECS/openssh.spec vim openssh.spec 找到 %configure \的配置,加一行--with-ssl-dir配置,这里的目录就是上面OpenSSL安装的目录 %configure \ --sysconfdir=%{_sysconfdir}/ssh \ --libexecdir=%{_libexecdir}/openssh \ --datadir=%{_datadir}/openssh \ --with-default-path=/usr/local/bin:/bin:/usr/bin \ --with-superuser-path=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin \ --with-privsep-path=%{_var}/empty/sshd \ --with-ssl-dir=/usr/local/openssl \ --with-md5-passwords \ --mandir=%{_mandir} \ --with-mantype=man \ --disable-strip \ 开始构建rpmbuild -ba openssh.spec …… 检查未打包文件:/usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/openssh-8.5p1-1.el7.x86_64 写道:/root/rpmbuild/SRPMS/openssh-8.5p1-1.el7.src.rpm 写道:/root/rpmbuild/RPMS/x86_64/openssh-8.5p1-1.el7.x86_64.rpm 写道:/root/rpmbuild/RPMS/x86_64/openssh-clients-8.5p1-1.el7.x86_64.rpm 写道:/root/rpmbuild/RPMS/x86_64/openssh-server-8.5p1-1.el7.x86_64.rpm 写道:/root/rpmbuild/RPMS/x86_64/openssh-askpass-8.5p1-1.el7.x86_64.rpm 写道:/root/rpmbuild/RPMS/x86_64/openssh-askpass-gnome-8.5p1-1.el7.x86_64.rpm 写道:/root/rpmbuild/RPMS/x86_64/openssh-debuginfo-8.5p1-1.el7.x86_64.rpm 执行(%clean): /bin/sh -e /var/tmp/rpm-tmp.Yhrfbl + umask 022 + cd /root/rpmbuild/BUILD + cd openssh-8.5p1 + rm -rf /root/rpmbuild/BUILDROOT/openssh-8.5p1-1.el7.x86_64 + exit 0升级OpenSSH备份配置文件mkdir ~/sshbak && cd ~cp /etc/pam.d/sshd sshbak/cp /etc/ssh/sshd_config sshbak检查一下sshd_config里的PermitRootLogin yes,如果这一项被注释掉或者是no的话需要改成yes,否则无法登录开始升级1.停止sshd服务 service sshd stop2.将做好的三个包放到同一个目录,我是直接放到了/root/cd /root/rpmbuild/RPMS/x86_64 cp openssh-8.5p1-1.el7.x86_64.rpm ~/ cp openssh-server-8.5p1-1.el7.x86_64.rpm ~/ cp openssh-clients-8.5p1-1.el7.x86_64.rpm ~/3.卸载旧版本的OpenSSHrpm -erpm -qa | grep openssh--nodeps4.rpm安装新版本[root@localhost ~]# rpm -Uvh *.rpm 准备中... ################################# [100%] 正在升级/安装... 1:openssh-8.5p1-1.el7 ################################# [ 33%] 2:openssh-clients-8.5p1-1.el7 ################################# [ 67%] 3:openssh-server-8.5p1-1.el7 ################################# [100%]5.还原配置文件[root@localhost ~]# cp sshbak/sshd /etc/pam.d/sshd cp:是否覆盖"/etc/pam.d/sshd"? y [root@localhost ~]# cp sshbak/sshd_config /etc/ssh/sshd_config cp:是否覆盖"/etc/ssh/sshd_config"? y6.授权并启动# chmod这一步不执行的话可能无法启动sshd服务 [root@localhost ~]# chmod 600 /etc/ssh/* [root@localhost ~]# service sshd start Starting sshd (via systemctl): [ 确定 ] [root@localhost ~]# ssh -V OpenSSH_8.5p1, OpenSSL 1.1.1k 25 Mar 2021升级成功现在已经升级到了OpenSSH 8.5,如果不需要使用scp的话可以卸载掉openssh-clients,因为OpenSSH 命令注入漏洞(CVE-2020-15778)是由openssh-clients引起的rpm -e openssh-clients-8.5p1-1.el7.x86_64 --nodeps精简升级步骤1.卸载旧版OpenSSL rpm -e `rpm -qa | grep openssl | grep -v libs` --nodeps 2.安装新版OpenSSL rpm -Uvh openssl* --nodeps 3.备份ssh文件 mkdir sshbak cp /etc/pam.d/sshd sshbak/ cp /etc/ssh/sshd_config sshbak/ 4.停止ssh服务 service sshd stop service sshd status 5.卸载openssh rpm -e `rpm -qa | grep openssh` --nodeps 6.安装openssh rpm -Uvh openssh* --nodeps 7.还原备份的ssh文件并启动ssh服务 cp sshbak/sshd /etc/pam.d/sshd cp sshbak/sshd_config /etc/ssh/sshd_config chmod 600 /etc/ssh/* service sshd start原文链接:https://www.kingc.top/archives/centosrhel76-sheng-ji-openssl-he-openssh
  • [技术干货] Linux操作系统rpm包安装方式详细步骤
      安装包(Install pack),即软件安装包,是可自行解压缩文件的集合,其中包括软件安装的所有文件。运行这个安装包(可执行文件),可以将此软件的所有文件释放到硬盘上,完成修改注册表、修改系统设置、创建快捷方式等工作。安装包文件多为exe格式。以下是小编帮大家整理的Linux操作系统rpm包安装方式详细步骤,仅供参考,大家一起来看看吧。  在Windows下安装一个软件很轻松,只要双击.exe的文件,安装提示连续“下一步”即可,然而linux系统下安装一个软件似乎并不那么轻松了,因为我们不是在图形界面下。所以你要学会如何在linux下安装一个软件。  在前面的内容中多次提到的yum,这个yum是RedHat所特有的安装RPM程序包的工具,使用起来相当方便。因为使用RPM安装某一个程序包有可能会因为该程序包依赖另一个程序包而无法安装。而使用yum工具就可以连同依赖的程序包一起安装。当然CentOS同样可以使用yum工具,而且在CentOS中你可以免费使用yum,但Redhat中只有当你付费后才能使用yum,默认是无法使用yum的。在介绍yum之前先说一说RPM相关的东西。  RPM是”Redhat Package Manager”的缩写,根据名字也能猜到这是Redhat公司开发出来的。RPM 是以一种数据库记录的方式来将你所需要的套件安装到你的Linux 主机的一套管理程序。也就是说,你的linux系统中存在着一个关于RPM的数据库,它记录了安装的包以及包与包之间依赖相关性。RPM包是预先在 linux机器上编译好并打包好的文件,安装起来非常快捷。但是也有一些缺点,比如安装的环境必须与编译时的环境一致或者相当;包与包之间存在着相互依赖 的情况;卸载包时需要先把依赖的包卸载掉,如果依赖的包是系统所必须的,那就不能卸载这个包,否则会造成系统崩溃。  如果你的光驱中还有系统安装盘的话,你可以通过”mount /dev/cdrom /mnt”命令把光驱挂载到/mnt目录下,那么你会在/mnt/CentOS目录下看到很多.rpm的文件,这就是RPM包了。  每一个rpm包的名称都由”-“和”.”分成了若干部分。就拿 a2ps-4.13b-57.2.el5.i386.rpm 这个包来解释一下,a2ps 为包名;4.13b则为版本信息;57.2.el5为发布版本号;i386为运行平台。其中运行平台常见的有i386, i586, i686, x86_64 ,需要你注意的是cpu目前是分32位和64位的,i386,i586和i686都为32位平台,x86_64则代表为64位的平台。另外有些rpm包并 没有写具体的平台而是noarch,这代表这个rpm包没有硬件平台限制。例如 alacarte-0.10.0-1.fc6.noarch.rpm 。下面介绍一下rpm常用的命令。原文链接:https://www.oh100.com/kaoshi/caozuoxitong/554541.html
  • [技术干货] RPM包安装
    1、如何安装rpm软件包rmp软件包的安装可以使用程序rpm来完成。执行下面的命令rpm -i your-package.rpm其中your-package.rpm是你要安装的rpm包的文件名,一般置于当前目录下。安装过程中可能出现下面的警告或者提示:... conflict with ... 可能是要安装的包里有一些文件可能会覆盖现有的文件,缺省时这样的情况下是无法正确安装的可以用rpm --force -i 强制安装即可... is needed by ...... is not installed ... 此包需要的一些软件你没有安装可以用rpm --nodeps -i 来忽略此信息也就是说,rpm -i --force --nodeps 可以忽略所有依赖关系和文件问题,什么包都能安装上,但这种强制安装的软件包不能保证完全发挥功能2、如何安装.src.rpm软件包有些软件包是以.src.rpm结尾的,这类软件包是包含了源代码的rpm包,在安装时需要进行编译。这类软件包有两种安装方法,方法一:执行rpm -i your-package.src.rpmcd /usr/src/redhat/SPECSrpmbuild -bp your-package.specs 一个和你的软件包同名的specs文件cd /usr/src/redhat/BUILD/your-package/ 一个和你的软件包同名的目录./configure 这一步和编译普通的源码软件一样,可以加上参数makemake install方法二:执行rpm -i you-package.src.rpmcd /usr/src/redhat/SPECS 前两步和方法一相同rpmbuild -bb your-package.specs 一个和你的软件包同名的specs文件这时,在/usr/src/redhat/RPM/i386/ (根据具体包的不同,也可能是i686,noarch等等)目录下,有一个新的rpm包,这个是编译好的二进制文件,执行rpm -i new-package.rpm即可安装完成。3、如何卸载rpm软件包使用命令 rpm -e 包名,包名可以包含版本号等信息,但是不可以有后缀.rpm。比如,卸载软件包proftpd-1.2.8-1,可以使用下列格式:rpm -e proftpd-1.2.8-1 rpm -e proftpd-1.2.8 rpm -e proftpd- rpm -e proftpd不可以是下列格式:rpm -e proftpd-1.2.8-1.i386.rpm rpm -e proftpd-1.2.8-1.i386 rpm -e proftpd-1.2 rpm -e proftpd-1有时会出现一些错误或者警告:... is needed by ... 这说明这个软件被其他软件需要,不能随便卸载可以用rpm -e --nodeps强制卸载4、如何不安装但是获取rpm包中的文件使用工具rpm2cpio和cpiorpm2cpio xxx.rpm | cpio -vi rpm2cpio xxx.rpm | cpio -idmv rpm2cpio xxx.rpm | cpio --extract --make-directories参数i和extract相同,表示提取文件。v表示指示执行进程d和make-directory相同,表示根据包中文件原来的路径建立目录m表示保持文件的更新时间。5、如何查看与rpm包相关的文件和其他信息下面所有的例子都假设使用软件包mysql-3.23.54a-11我的系统中安装了那些rpm软件包rpm -qa 列出所有安装过的包如果要查找所有安装过的包含某个字符串sql的软件包rpm -qa |grep sql如何获得某个软件包的文件全名rpm -q mysql可以获得系统中安装的mysql软件包全名,从中可以获得当前软件包的版本等信息。这个例子中可以得到信息mysql-3.23.54a-11。一个rpm包中的文件安装到那里去了?rpm -ql 包名注意:这里的包名是不包括.rpm后缀的软件包的名称,也就是说只能用mysql或者mysql-3.23.54a-11而不是mysql-3.23.54a-11.rpm,如果只是想知道可执行程序放到那里去了,也可以用which,比如which mysql一个rpm包中包含那些文件一个没有安装过的软件包,使用:rpm -qlp ****.rpm一个已经安装过的软件包,还可以使用:rpm -ql ****.rpm如何获取关于一个软件包的版本,用途等相关信息?一个没有安装过的软件包,使用rpm -qip ****.rpm。一个已经安装过的软件包,还可以使用rpm -qi ****.rpm。某个程序是哪个软件包安装的,或者哪个软件包包含这个程序rpm -qf `which 程序名` 返回软件包的全名 rpm -qif `which 程序名` 返回软件包的有关信息 rpm -qlf `which 程序名` 返回软件包的文件列表注意,这里不是引号,而是`,就是键盘左上角的那个键,也可以使用rpm -qilf,同时输出软件包信息和文件列表。某个文件是哪个软件包安装的,或者哪个软件包包含这个文件注意,前一个问题中的方法,只适用与可执行的程序,而下面的方法,不仅可以用于可执行程序,也可以用于普通的任何文件,前提是知道这个文件名,首先获得这个程序的完整路径,可以用whereis或者which,然后使用rpm -qf例如:# whereis ftptop ftptop: /usr/bin/ftptop /usr/share/man/man1/ftptop.1.gz # rpm -qf /usr/bin/ftptop proftpd-1.2.8-1 # rpm -qf /usr/share/doc/proftpd-1.2.8/rfc/rfc0959.txt proftpd-1.2.8-1获得软件包相关的信息用rpm -q,q表示查询query,后面可以跟其他选项,比如i 表示info,获得软件包的信息; l 表示list,获得文件列表; a 表示all,在所有包中执行查询; f 表示file,根据文件进行相关的查询; p 表示package,根据软件包进行查询需要的查询条件可以使用grep产生,或者从""中的命令行产生原文链接:https://www.kancloud.cn/linux-tech/linux_learning/661736
  • [常见FAQ] 官方SDK的C++为什么在线下用判题器测试时,得分为0?
    这是什么问题导致的??????
  • [技术干货] 【Linux虚机网络配置】SSH服务监听多个ip,实现配有大小网虚机网络可同时访问目的
    背景:Linux虚机配置2张网卡(大小网),因网络限制,需要进行大小网切换,以此达到网络相通目的。多次切换大小网影响效率,为提高效率,通过增加监听地址方式, 无需再切换大小网,虚机在大小网可同时访问(达到在大网环境下通过大网地址可访问,小网环境通过小网地址可访问的效果)。操作步骤:1、编辑sshd_config文件,增加监听地址。如:10.25.46.148,192.168.5.46vi /etc/ssh/sshd_config编辑ListenAddress 10.25.46.148ListenAddress 192.168.5.46保存并退出2、重启生效/etc/init.d/sshd restart
  • [技术干货] Linux版本中Nginx平滑升级与回退
    一、平滑升级概述1.平滑升级的定义在进行服务版本升级的时候,对于用户访问体验无感知,不会造成服务中断。2.平滑升级的思路(1)关于版本和备份下载新版本nginx了解原旧版nginx编译参数将旧nginx二进制文件进行备份,然后替换成新的nginx二进制文件(2)向旧的Nginx的master进程发送USR2信号将旧的master进程的pid文件添加后缀.oldbin,master进程会用新nginx二进制文件启动新的master进程(3)向旧的master进程发送winch信号,旧的worker子进程退出(4)向旧master进程发送quit信号,旧的master进程就退出3.平滑升级的信号信号含义QUIT关闭HUP重启USR1重新打开日志文件,reponUSR2平滑升级可执行的二进制程序WINCH平滑关闭worker进程4.平滑升级示意图二、Nginx平滑升级1.安装依赖1yum install gcc redhat-rpm-config \ libxslt-devel gd-devel perl-ExtUtils-Embed \ geoip-devel gperftools-devel pcre-devel openssl-devel -y2.编译并安装nginx123456789root@web ~] wgethttp://nginx.org/download/nginx-1.16.1.tar.gz  [root@web ~] tar xf nginx-1.16.1.tar.gz  [root@web ~] cd nginx-1.16.1/  [root@web ~] ./configure --  [root@web ~] make3.备份旧的Nginx二进制12[root@web nginx-1.16.1] mv /usr/sbin/nginx/usr/sbin/nginx.old [root@web nginx-1.16.1] cp objs/nginx/usr/sbin/nginx4.向旧的master发送USR2信号1234[root@web nginx-1.16.1] ps -ef |grep nginx [root@web nginx-1.16.1] kill -USR2 20848 [root@web nginx-1.16.1] cat /var/run/nginx.pid.oldbin 20848 [root@web nginx-1.16.1] ps -ef |grep nginx5.向旧master发送winch信号12[root@web nginx-1.16.1]# kill -WINCH 20848 [root@web nginx-1.16.1]# ps -ef |grep nginx6.向旧master发送QUIT信号12[root@web nginx-1.16.1] kill -QUIT 20848 [root@web nginx-1.16.1] ps -ef |grep nginx三、Nginx平滑回退1.思路替换nginx二进制文件,向旧的master发送USR2信号,向旧的master发送WINCH,向旧的master发送QUIT2.替换nginx二进制文件12[root@web ~] mv /usr/sbin/nginx/usr/sbin/nginx-1.16 [root@web ~] mv /usr/sbin/nginx.old/usr/sbin/nginx3.向旧的master发送USR2信号123[root@web ~] ps -ef |grep nginx [root@web ~] kill -USR2 24971 [root@web ~] ps -ef |grep nginx4.向旧的master发送WINCH信号12[root@web ~] kill -WINCH 24971 [root@web ~] ps -ef |grep nginx5.向旧的master发送QUIT信号12[root@web ~] kill -QUIT 24971 [root@web ~] ps -ef |grep nginx转载自https://www.jb51.net/article/273886.htm
  • [技术干货] 【Linux】冯诺依曼体系结构与操作系统概念理解-转载
     一、前言 小伙伴们,新年好!距离上次创作已经过去半个月了,a n d u i n anduinanduin 最近也去学习了一些新知识,但是目前还在整理笔记,所以估计得等到三月份才能逐渐写出博客来。  但是 a n d u i n anduinanduin 也不能闲着,于是今天我就为大家带来一篇干货文章。本篇文章对于冯诺依曼体系结构作出了详细讲解,特别是对于内存、数据流动;另一部分则是 a n d u i n anduinanduin 对于操作系统的一些理解,对于其中的管理我也做出了剖析,相信看完一定会有所收获。  话不多说,让我们赶快开始学习吧!  二、冯诺依曼体系结构 1、体系简述 学习过计算机组成原理的小伙伴们应该对冯诺依曼体系结构并不陌生。冯诺依曼体系结构是一种将程序指令存储器和数据存储器合并在一起的存储器结构。  我们常见的计算机,如笔记本,或是不常见的服务器,基本都遵守冯诺依曼体系。   目前的计算机,单靠计算机本身是无法完成交互工作的,所以需要 人将数据“喂给”计算机 ,说白了就是 输入设备 ;同样的 计算机也需要把处理数据的结果呈现给用户 ,说白了就是 输出设备 。  而这一过程中依赖的两个设备就是体系结构中的输入输出设备,两种常见的设备如下:  输入设备:键盘、话筒、摄像头、网卡、磁盘、鼠标… 输出设备:显示器、磁盘、网卡、声卡、音箱… 对于同一个设备而言,可以同时充当输入设备和输出设备,例如 磁盘 :  磁盘上的文件就是用户保存的文件。用户保存就说明 采集了用户的数据 ,再将文件进行运行,如:计算机计算、加密等… ,这一过程就是 输入 。  同样的,用户在磁盘上下载了一个文件,例如一部电影,那么磁盘上的文件需要被用户观看,这就相当于把 结果呈现给用户 ,这一过程为 输出 。  而对于结构中的 存储器、运算器、控制器 我们也需要拎一下概念:  存储器不是磁盘,而是 内存 计算机的本质工作是计算,所以一定需要运算器和控制器,它们被合称为 cpu 输入、输出设备被称为外围设备,即外设 :  外设包含输入输出,所以外设一般都会比较慢,比如磁盘。而内存则在磁盘的基准上高了许多量级。  但是外设比较便宜,比如买电脑时,电脑磁盘动不动 512g, 1t ,但是内存只有 8, 16g 。  对于它们两个都可以存储数据,但是对于内存存储数据是有时效性的。内存属于掉电易失介质 ,若突然关机,内存数据就会丢失;但是对于磁盘则不会。  但是内存储存数据的时效性短,为什么价格还是比外设贵?因为一个字,快 。  2、内存的重要性 可能大家会有疑惑,计算机中内存并不是最快的,cpu速度是最快的 ,那么既然这样,为什么要有内存呢?直接舍弃内存,让输入设备直接连到 cpu 不行吗?比如这样:   我让输入设备通过 cpu 计算后,直接输出,这样岂不是更快?  方案确实可以,但是会有代价。 因为外设是极其慢的,而 cpu 太快了。  这就涉及到一个理论 —— 木桶原理 :   木桶原理:一只木桶盛水的多少,并不取决于木桶壁上最高的那块木板,而是取决于最短的那块。  对于体系结构来说也是这样。如果对应的输入很慢,但是 cpu 很快,整体表现出来的整体效率就以外设为主。  所以这时,冯诺依曼大神就引入了 内存 。内存比外设快的多,但是比 cpu 慢。  举个例子,外设可以理解为毫秒级,内存是微秒级,cpu 是纳秒级。这中间的差距都很大,但是可以互补。  内存可以临时存储数据,并且不慢。而在 cpu 计算数据的同时,DMA又可以把外设的数据搬到内存,等 cpu 把数据执行完毕后,再直接执行刚刚搬进来的数据。  因为内存的存在,就可以大大缓解木桶原理带来的效率下降。  所以这里得出一个结论:在数据层面,一般 cpu 不和外设直接沟通,而是直接和内存打交道,由此看出内存的重要性。  那么有没有可以代替内存的存储设备?  通过上面的了解,我们发现内存是没有制造数据的能力的,它就像一个驿站,用来中转数据。但是既然是一个中转站的功能,如果谈到速度和功能,cpu 中还有个 寄存器 ,它的速度是极快的,那么 为什么不拿寄存器作为存储单元来缓解木桶效应?  一个字:贵 ,寄存器在 cpu 中只有极小部分。我们当前的计算机实际上是通过技术手段打造的一个性价比产品,因为一些存储设备太贵了。所以就用内存来平衡外设和 cpu 之间的速度不均衡。从而达到既能完成工作并且效率均衡且便宜的特点。  3、硬件方案解释软件行为 说到这儿,我们其实可以理解之前一些难以解答的问题:  ​ 为什么一个程序必须要选加载到内存才能执行?  我们自己写的 c 代码,生成的可执行程序就是一个文件,是文件就在磁盘中保存,而磁盘属于外设。  而当可执行程序运行时,需要 cpu 帮忙执行,而现在的计算机符合冯诺依曼体系结构,所以 cpu 访问你的代码和数据时就必须问内存要,所以数据需要被加载到内存,以便让 cpu 读取数据!  而程序加载到内存在 windows 上是双击,在 linux 上则是 ./ 运行。  而这一切的一切就是因为体系结构,这就是用 硬件方案解释软件行为 。  4、体系结构中的数据流动 学习了冯诺依曼体系结构,我们再来谈谈数据之间的流向。  假设你和你的朋友在聊天,当你向你朋友发送 “吃了吗” 信息时,数据时在体系结构中如何流动的?  假设你和你的朋友的点电脑都符合冯诺依曼体系结构,且不考虑中间网络层的传输,假定发送出去就能被接收:   对于 a n d u i n anduinanduin 也就是我,我通过输入设备(键盘)输入“吃了吗”,从硬件层面上数据被输入到内存,软件层面上数据被输入到 qq 。  这里我们 只考虑硬件层面 ,当数据输入后,数据被加载到内存这时数据就要进行计算(例如加密),这时 cpu 就需要从内存中拿数据,再计算完毕之后,将数据返回内存,数据再被显示到输出设备。  而这里有 两个刷新动作 ,一个是数据当被发送时,显示在自己电脑的显示框,这种很简单。  而 第二个刷新动作就是把数据刷新到 G u l d a n GuldanGuldan 的电脑上 ,这其中的流动规则如下:  当 a n d u i n anduinanduin 的数据输出后,输出到输出设备(网卡)上,网卡再刷新到网络。G u l d a n GuldanGuldan 通过输入设备(网卡),将数据加载到内存中,cpu计算(解密操作),再写回内存,再次刷新数据到输出设备(对方显示屏)上。  而这过程实际上是符合体系结构的,并不是说,当信息发送出去后,就直接一步到位到 G u l d a n GuldanGuldan 的显示屏。  而对于一些加密,解密,以及将数据从外设读到内存这些都是软件提供的,这些我们暂时不要考虑。  讲到这里再提一嘴:其实从外设获取数据,我们也天天在用,比如 c 语言的 scanf ,就是从外设读数据的。所以这里就不难理解为啥软件可以获得外设的输入。  至此我们就得出结论:数据在流动的时候必须从外设到达内存,并不能直接到达目标地点,完全遵守冯诺依曼体系结构。说白了就是 外设只和内存打交道。  5、拓展 实际上对于外设只和内存打交道在之前是有歧义的:  因为早期芯片集成数据的能力较差。会把输入设备的数据直接打给 cpu ,读取的时候再通过 cpu 把数据放到内存里。再把数据缓存起来,需要使用的时候再把数据拿出来。  而现在 cpu 里面通常还带了 dma 芯片,就是专门把外设数据搬到内存的,这样外设和 cpu 和外设之间就无需直接沟通了,所以咱们当前认为 cpu 不直接和外设沟通。  还有一点需要补充的是:  外设和cpu虽然数据层面不直接交互,但是对于一些控制信号,它们之间是要交涉的,比如外设要给cpu发控制信号,需要让cpu帮外设做事情。但是当前我们还不考虑这点,还是考虑数据层面上,cpu和外设不直接沟通。  而冯诺依曼我们就聊到这儿。  三、操作系统简述 我们知道 Linux 是一个操作系统,但是什么是操作系统?对于这个概念我们了解起来也许模棱两可,所以今天的另一个话题就是谈谈操作系统。  首先看一下计算机体系图,接下来的内容会涉及到体系中的内容:   1、概念 任何计算机系统都包含一个基本的程序集合,称为操作系统,也就是 OS 。如果笼统的理解操作系统,它就包含两部分:  内核(进程管理,内存管理,文件管理,驱动管理) 其他程序(例如函数库,shell 程序等) 2、重要性 当讲冯诺依曼的时候,我们说过,数据是被加载到内存中,再供 cpu 进行内存读取的。  但是中间涉及了一大堆工作,例如,预加载的数据是哪一部分数据,内存如果不够了这时候怎么办?  随便抛出一个数据可能我们都说不出来,而这些工作其实都是软件做的,这个软件就是操作系统。  打个比方,硬件就好比是医院里的检测仪器,输出仪器。但是只有机器能看病吗?肯定不行,还得需要医生,而这其中面临很多问题,比如症状的分流,人员的分配,病人找到医生的方式,这么些抽象的问题仅仅依靠仪器是不能处理的。  这就说明软件是必须的,而这些繁杂的工作都由操作系统来处理。  3、定位 接下来我们看看 OS 的定位。其实 OS 定位很简单,它就是一款软件。  所有程序想要运行,都必须加载到内存中,而在开机加载的时候操作系统就被加载到了内存中,这样软件就可以被 cpu 跑了。  操作系统本身是一款对软硬件资源进行管理的软件。  4、如何管理 对于管理,一共有 三个结论 ,我们通过例子中间穿插着概念来感性理解它们:  首先明确一下管理者和被管理者 :  日常生活中,我们需要进行各种决策(想干什么)和执行(做什么)。  而在一个组织结构中,真正的管理者做的就是决策。其实这么说还不够详细,应该说管理者不是完全不做执行,但是管理者大部分时间都在决策。  若当前背景是一个学校,我们就将学校抽象成三部分:校长、辅导员、学生,如下:   而辅导员和校长都可以进行管理,但是他们谁是真正的管理者?校长 ,因为校长本身的工作大部分都在决策。  举个例子:  比如学校举办一个运动会。对于运动会场地,经费都是校长来决策,而剩下的就是学生执行。  那么辅导员再干什么?辅导员就是把校长的决策落地,部分决策让学生去干什么,部分执行去执行校长的决策。  也就是校长把决策给辅导员,辅导员执行校长的决策。相当于辅导员做的就是 伪决策 。  所以辅导员不是一个真正的管理者,辅导员只是对校长的决策做落地的角色,而学生就是纯粹的执行者。  所以校长才是真正的管理者 。  通过这一过程,角色就划分成了三块:   而这一过程校长(管理者)和被管理者(学生)见过面了吗?很明显没有。可能在大学中,学生见到校长也就是开学典礼的时候,只是一面之缘。  到这里,我们得出第一个结论:管理者和被管理者是不需要直接沟通的。  问题来了,既然管理者和被管理者没有直接沟通,它是如何管理我的?  再来举个例子:  比如说你的父母,在高中可能可以天天看着你,属于直接管理。但是上了大学父母不能进行直接管理,但是可以通过别人,例如你的室友,你的辅导员,获得你最近的行动,这样也可以进行管理。  而这一行为不就是管理者(父母)和被管理者(我)没有直接沟通,但是依然管理了。而管理方式就是通过数据。  至此,我们得出了第二个结论:管理的本质是对被管理对象的数据做管理。  通过这个结论,又衍生出了两个问题:  ​ 1)管理者是如何拿到被管理者的数据的 ?  这就好比校长从没见过我,但是它是如何管理到我的,怎么拿到我的数据?  这个过程就需要辅导员来进行,辅导员拿到数据,然后把数据给校长。  ​ 2)如果被管理者基数庞大,管理者是如何处理海量数据,筛选出特定数据?  虽然学生的数据不一样,但是学生的属性信息类型是一样的,比如:姓名、年级、电话、成绩、紧急联系人 …  而如果,我是说如果,校长一看这个,就想起了结构体,那么完全可以 把信息抽象成一个结构体 s t r u c t   s t u struct\ stustruct stu 。而对于信息管理,可以将其抽象成一个链表,这时每个学生的信息就是一个节点:   这时如果要筛选出数据,就只需要根据关键值筛选就可以,从而将管理行为转换成对链表的管理。  而如果需要对学生进行信息删除,就只需要找到节点,然后释放,之后这个节点就被移除了,这个节点也消失,不需要再管理了。  这时决策就转换成对链表的增删查改。  而一个决策被转换为对数据结构的管理,这就相当于完成了一个建模的过程,把具体场景转换为计算机语言,就是建模的过程。  所以这里体现出语法和数据结构的重要性 :  这里就是先用结构体进行描述,再采集信息,构建对象,再形成某种结构,再把节点组织起来,并根据某种特性进行特殊化构建。  这其中就涉及到了面向对象和数据结构。  好了,现在也就引出了第三个结论:管理的方法是先描述,再组织。 而这句话也会被贯穿到之后 Linux 的学习中,一定要记好了。  管理的方法我们说完了,那么校长,辅导员和学生都代表着计算机里的什么角色?  学生:硬件(软件),这里的软件包括应用层和操作系统内的软件 辅导员:硬件驱动 校长:操作系统  而硬件驱动,实际上就是驱动程序,它和硬件交互,拿到硬件传输的数据。操作系统发布决策给驱动,而操作系统是真正的管理者。  管理到这就讲完了,总结一下管理的特性和本质 :  管理者和被管理者是不需要直接沟通的 管理的本质是对被管理对象的数据做管理 管理的方法是先描述,再组织 5、管理目的 上面说了这么多管理的方法,但是操作系统为什么要对软硬件资源进行管理呢?它图啥呢?  为了更好地给用户提供服务,不让软件老是出 bug 。  要知道,一款操作系统能否生存,就是依赖于生态链和用户人数。不妨设想一下,如果操作系统动不动就蓝屏,打着打着游戏就关机了,还有人用吗?  肯定没有,这样子用户人数急剧减少,操作系统的生存问题就会出现了。而人们挑选操作系统的依据就是 是否好用 ,所以操作系统必须优化体验。  所以操作系统通过对下管理好软硬件资源,对上(用户层)给用户提供 安全、稳定、高效、功能丰富 的执行环境,让用户有一个最佳体验,这就是目的!  四、系统调用 刚说完管理目的,操作系统也为我们提供者服务,但是有一个问题,操作系统相信我吗?  这个问题可能很无厘头,是什么意思?提供服务不就完了,什么是相信?  同样的,我们举一个例子:  好比现在我们把银行当做一个操作系统,当我们去银行存钱的时候。银行人员看到你会说:“先生,往直走转弯就是金库,你把钱放在那边,不要拿走里面的钱,你就自己去存钱吧!”  这显然是不可能的,这也就反映了,虽然操作系统给我们提供了很好的服务,但是OS不相信我们,不相信任何人。  相反,操作系统会进行一些措施进行自我保护,比如银行配备了保安,操作系统也有对应的封装。  而生活中,银行是通过柜台来通过工作人员的操作,帮助我们存钱,就比如:   通过柜台窗口,把需求给员工,让员工完成操作,对于银行为了提供服务和保证自身安全,提供的是窗口式服务。  而对于操作系统,这个窗口式服务就是系统调用,而说到这边,我们就可以画出计算机软硬件体系结构图:   操作系统选择将对应的功能以接口的形式让别人访问,这一批接口,就被称为操作系统的系统调用。  而这一操作既帮助我们完成了功能,又保护了操作系统本身。  其实我们也都用过系统调用接口,但是它是以一种更简单的方式提供给我们使用了。  因为系统调用接口的使用成本很高,于是就有相关人员对系统接口进行二次的软件开发,例如:图形化界面,s h e l l shellshell 和工具集。  而通过 shell 工具,我们就可以通过操作系统,对硬件或软件进行交互,例如 touch 这就是通过指令,依靠封装后的系统调用,从而贯穿体系结构,往磁盘(硬件)写入,从而生成文件。  同理对于语言,也就是库函数,也调用了系统调用 :  例如 printf 显示的设备是硬件,而向硬件写入的就是通过操作系统进行软硬件资源管理。printf 就是 C 语言通过包含头文件,而它的底层就调用了系统调用接口。 而我们当前的开发,还在系统调用二次开发的上层,也就是用户层 。这里的用户层指的是开发者,也就是程序员的那一层,而对于老百姓使用的层次,还在上面一层。  注:对于使用系统调用接口的程序,不具备跨平台性。因为此刻的接口是该系统独有的。  五、结语 到这里,本篇博客就到此结束了。  相信看完文章,大家应该都对冯诺依曼体系结构和操作系统以及系统调用有了一定的了解。尤其是在管理部分一定要记住:先描述、再组织 ,这句话可以说是本篇文章的核心之一。  由于本篇是纯概念,所以建议看完可以好好消化一下,毕竟没有代码那么好记。  如果觉得 a n d u i n anduinanduin 写的不错的话,可以 点赞 + 收藏 + 评论 支持一下哦!我们下期见~ ———————————————— 版权声明:本文为CSDN博主「安 度 因」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/m0_67867172/article/details/128767992 
  • [技术干货] LINUX查看进程的4种方法(小结)
    进程是在 CPU 及内存中运行的程序代码,而每个进程可以创建一个或多个进程(父子进程)。查看进程方法第一种:ps auxps命令用于报告当前系统的进程状态。可以搭配kill指令随时中断、删除不必要的程序。ps命令是最基本同时也是非常强大的进程查看命令,使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等,总之大部分信息都是可以通过执行该命令得到的。a:显示当前终端下的所有进程信息,包括其他用户的进程。u:使用以用户为主的格式输出进程信息。x:显示当前用户在所有终端下的进程。示例:上图中各字段解释:USER:启动该进程的用户账号名称 PID:该进程的ID号,在当前系统中是唯一的 %CPU:CPU占用的百分比 %MEM:内存占用的百分比VSZ:占用虚拟内存(swap空间)的大小 RSS:占用常驻内存(物理内存)的大小TTY:该进程在哪个终端上运行。“?”表未知或不需要终端 STAT:显示了进程当前的状态,如S(休眠)、R(运行)、Z(僵死)、<(高优先级)、N(低优先级)、s(父进程)、+(前台进程)。对处于僵死状态的进程应予以手动终止。START:启动该进程的时间 TIME:该进程占用CPU时间 COMMAND:启动该进程的命令的名称总结:ps aux 是以简单列表的形式显示出进程信息。第二种:ps -elf-e:显示系统内的所有进程信息。-l:使用长(long)格式显示进程信息。-f:使用完整的(full)格式显示进程信息。上图字段解释: 大部分跟第一种一样,PPID为父进程的PID。第三种:top以全屏交互式的界面显示进程排名,及时跟踪包括CPU、内存等系统资源占用情况,默认情况下每三秒刷新一次,其作用基本类似于Windows系统中的任务管理器。上图解释:Tasks(系统任务)信息:total,总进程数;running,正在运行的进程数;sleeping,休眠的进程数;stopped,中止的进程数;zombie,僵死无响应的进程数。CPU信息:us,用户占用;sy,内核占用;ni,优先级调度占用;id,空闲CPU;wa,I/O等待占用;hi,硬件中断占用;si,软件中断占用;st,虚拟化占用。了解空闲的CPU百分比,主要看%id部分。Mem(内存)信息:total,总内存空间;used,已用内存;free,空闲内存;buffers,缓存区域。Swap(交换空间)信息:total,总交换空间;used,已用交换空间;free,空闲交换空间;cached,缓存空间。第四种:pstree -aup以树状图的方式展现进程之间的派生关系,显示效果比较直观。 -a:显示每个程序的完整指令,包含路径,参数或是常驻服务的标示; -c:不使用精简标示法; -G:使用VT100终端机的列绘图字符; -h:列出树状图时,特别标明现在执行的程序; -H<程序识别码>:此参数的效果和指定”-h”参数类似,但特别标明指定的程序; -l:采用长列格式显示树状图; -n:用程序识别码排序。预设是以程序名称来排序; -p:显示程序识别码; -u:显示用户名称;到此这篇关于LINUX查看进程的4种方法(小结)的文章就介绍到这了转载自https://zongxp.blog.csdn.net/article/details/123211238?spm=1001.2014.3001.5502
  • [技术干货] Linux之常用的压缩解压缩命令
     记录一下平时常用到的压缩解压缩命令,免去每次查找的麻烦(不断完善)  1 解压命令 tar -xvf filename.tar tar -zxvf filename.tar.gz tar -zxvf filename.tgz tar -jxvf filename.tar.bz2 tar -xZvf filename.tar.Z unrar e filename.rar # 解压到当前目录 unrar x filename.rar /path/to/extract  unzip filename.zip -d filepath tar.xz文件解压:先xz -d xxx.tar.xz到tar,然后tar xvf xxx.tar 2 压缩命令 tar -zcvf filename.tar.gz filename tar -zcvf filename.tgz filename tar -jcvf filename.tar.bz2 filename zip filename.zip filename zip -r location.zip location gzip -d filename.gz filename rar -a filename.rar filename 3 多个压缩文件 如果遇到某个文件夹过大,需要将压缩文件跟个成 N 个指定大小的文件,便于邮件等方式传输,可以使用下边的方法  首先先压缩成一个大文件  tar -zcvf filename.tar.gz filenam  然后使用 split 指令进行切分  split -b 4000M -d -a 1 filename.tar.gz filename.tar.gz. cat filename.tar.gz | split -b 4000M -d -a 1 filename.tar.gz. 其中,  -b 4000M 表示设置每个分割包的大小,单位还是可以k -d "参数指定生成的分割包后缀为数字的形式 -a x来设定序列的长度(默认值是2),这里设定序列的长度为1  也可以合成一步进行操作  tar -zcvf filename.tar.gz filename | split -b 4000M -d -a 1 -filename.tar.gz. 多个压缩文件解压方法如下  cat filename.tar.gz.* | tar -zxv 转载自https://blog.csdn.net/zong596568821xp/article/details/106024351
  • [技术干货] shell sleep睡眠命令的具体使用【转】
    1. 背景当用户在 Linux 中发出多个命令序列时,命令会立即一个接一个或同时执行(例如,tee 命令)。但是,有时需要推迟命令的执行并为系统提供足够的时间来产生预期的结果。2. 简介sleep命令将下一个命令的调用进程挂起一段指定的时间。当以下命令的执行取决于前一个命令的成功完成时,此属性很有用。3. 语法1sleep [number]默认情况下,系统读取之后sleep的数字作为秒数。要指定其他时间单位,请使用以下语法:sleep [number][unit] sleep 1h 2m 0.5s 该sleep命令接受浮点数。它允许多个值相加,以计算sleep.可用单位有:s– 秒m- 分钟h- 小时d- 天要sleep在开始后和指定的等待时间结束前停止,请按Ctrl + C。要查看该sleep命令的帮助,请键入:sleep --help  有关版本详细信息,请键入:sleep --version 4. 与 wait 区别bash wait 命令是一个Shell 命令,它等待后台运行的进程完成并返回退出状态。与等待指定时间的 sleep 命令不同,wait 命令等待所有或特定的后台任务完成。5. 实例5.1 设置警报用于sleep告诉系统在一定时间后播放 mp3 文件。sleep 7h 30m && mplayer alarm.mp3 5.2 终端中的延迟命令sleep对于强制执行两个命令之间的时间很有用,以一秒的间隔执行:$ sleep 1 && echo "one" && sleep 1 && echo "two" one two 5.3 变量分配给 sleep可以将变量分配给sleep命令。#!/bin/bash SLEEP_INTERVAL="30" CURRENT_TIME=$(date +"%T") echo "Time before sleep: ${CURRENT_TIME}" echo "Sleeping for ${SLEEP_INTERVAL} seconds" sleep ${SLEEP_INTERVAL} CURRENT_TIME=$(date +"%T") echo "Time after sleep: ${CURRENT_TIME}" 该脚本定义了一个名为的变量SLEEP_INTERVAL ,其值稍后用作sleep命令的参数。此示例脚本的输出显示执行持续了 30 秒:$ ./time_script.sh Time before sleep: 00:01:15 Sleeping for 30 seconds Time after sleep: 00:01:45 
  • [技术干货] getopts解析shell脚本命令行参数的方法【转】
    getopts命令格式1getopts optstring name [arg]optstring为命令行所有选项组成的字符串,每个字母代表一个选项。如果字母后有冒号:,表明该选项需要选择参数。比如说,执行getopts时,匹配到了-i选项,则将-i相应的参数保存在内置变量OPTARG中。如果字母后无:,表明该选项不要指定值,仅有true/false之分。optstring起始的第一个冒号,则表示执行命令中出现optstring中没有的选项时忽略错误。name为变量。每执行一次getopts,会获取执行命令行中的下一个选项。当执行命令的选项与optstring匹配时,将选项放在name中。否则,name被设置为?。arg是选项和参数组成的列表。可选项,代码示例编写脚本test.sh#!/bin/bash   while getopts ":i:o:b" i do         case ${i} in                 i) input_dir="$OPTARG";;                 o) out_dir="$OPTARG";;                 b) relax=true;;         esac done   echo $input_dir echo $out_dir echo $relax执行test.sh结果~/tmp$ bash test.sh -i ./input/ -o ./output/ -a -b./input/./output/truePS:linux shell 解析命令行参数 | while getopts用法linux shell 解析命令行参数|getpotsdemo: #!/bin/bash  func() {     echo "Usage:"     echo "test.sh [-j S_DIR] [-m D_DIR]"     echo "Description:"     echo "S_DIR,the path of source."     echo "D_DIR,the path of destination."     exit -1 }  upload="false"  while getopts 'h:j:m:u' OPT; do     case $OPT in         j) S_DIR="$OPTARG";;         m) D_DIR="$OPTARG";;         u) upload="true";;         h) func;;         ?) func;;     esac done  echo $S_DIR echo $D_DIR echo $upload 输出sh test.sh -j /data/web -m /opt/data/web##输出结果/data/web/opt/data/webfalseoptstring列出了对应的Shell脚本可以识别的所有参数,例如:需要使用-a,-f,-s参数时,optstring是afs;如果需要命令行参数后面还跟随一个值,则在相应的optstring后面加冒号,例如a:fs 表示a命令行参数后面会有一个值,是**-a value**的形式;getopts执行时若匹配到a参数,会把-a参数对应的value存放在一个叫OPTARG的Shell Variable中;如果optstring是以冒号开头,则表明当命令行出现了optstring中没有的参数将不会提示错误信息getpotsgetpots是Shell命令行参数解析工具,旨在从Shell Script的命令行当中解析参数。getopts optstring name [arg...]optstring列出了对应的Shell Script可以识别的所有参数。比如:如果 Shell Script可以识别-a,-f以及-s参数,则optstring就是afs;如果对应的参数后面还跟随一个值,则在相应的optstring后面加冒号。比如,a:fs 表示a参数后面会有一个值出现,-a value的形式。name表示的是参数的名称,每次执行getopts,会从命令行当中获取下一个参数,然后存放到name当中。如果获取到的参数不在optstring当中列出,则name的值被设置为?。
  • [技术干货] /bin/sh -c干什么的
    解决命令的权限问题,可以扩大权限的范围linux命令是对Linux系统进行管理的命令。对于Linux系统来说,无论是中央处理器、内存、磁盘驱动器、键盘、鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与之前的DOS命令类似。linux命令在系统中有两种类型:内置Shell命令和Linux命令。操作指令首先介绍一个名词“控制台(console)”,它就是我们通常见到的使用字符操作界面的人机接口,例如dos。我们说控制台命令,就是指通过字符界面输入的可以操作系统的命令,例如dos命令就是控制台命令。我们要了解的是基于Linux操作系统的基本控制台命令。有一点一定要注意,和dos命令不同的是,Linux的命令(也包括文件名等等)对大小写是敏感的,也就是说,如果你输入的命令大小写不对的话,系统是不会做出你期望的响应的。比如要向 test.asc 文件中随便写入点内容,可以:$ echo "信息" >> test.csv如果将 test.asc 权限设置为只有 root 用户才有权限进行写操作:$ sudo chown root.root test.csv然后,我们使用 sudo 并配合 echo 命令再次向修改权限之后的 test.asc 文件中写入信息:`$ sudo echo "hahah" >> test.csv`-bash: test.asc: Permission denied这时可以看到 bash 拒绝这么做,说是权限不够。这是因为重定向符号 “>” 和 ">>" 也是 bash 的命令。我们使用 sudo 只是让 echo 命令具有了 root 权限,但是没有让 “>” 和 ">>" 命令也具有 root 权限,所以 bash 会认为这两个命令都没有像 test.csv文件写入信息的权限。解决这一问题的途径有两种。第一种是利用 "sh -c" 命令,它可以让 bash 将一个字串作为完整的命令来执行,这样就可以将 sudo 的影响范围扩展到整条命令。具体用法如下:$ sudo /bin/sh -c 'echo "hahah" >> test.asc'另一种方法是利用管道和 tee 命令,该命令可以从标准输入中读入信息并将其写入标准输出或文件中,具体用法如下:$ echo "hahah" | sudo tee -a test.asc注意,tee 命令的 "-a" 选项的作用等同于 ">>" 命令,如果去除该选项,那么 tee 命令的作用就等同于 ">" 命令对于编程的影响:shell脚本中如果有多个echo命令,如果不适用/bin/sh -c执行脚本,那么在java中使用BufferedReader获取脚本的输出时,只能获取到第一个echo的输出,使用/bin/sh -c则能获取到所有的echo输出。原文链接:https://www.jianshu.com/p/bda8d3cbdbae
  • [Ubuntu] 求教:安装clash遇到的问题,该如何处理?
    设备型号:华为擎云L410KLVU-WDU0B操作系统:银河麒麟桌面操作系统V10(SP1)故障描述:下载clash,地址如下:https://github.com/Fndroid/clash_for_windows_pkg/releases/download/0.20.12/Clash.for.Windows-0.20.12-arm64-linux.tar.gz解压缩后,运行cfw程序,提示:[75140:1230/230532.671202:ERROR:gpu_memory_buffer_support_x11.cc(44)] dri3 extension not supported.
  • linux日常使用的文件和目录相关命令
    常见的文件和目录相关命令pwd 命令作用:显示当前的工作路径例子:/usr/local/nginxcd 命令作用:改变当前工作目录(进入到某个目录中)例子:cd /usr/local/nginx扩展路径绝对路径在Linux系统中 Unix系统中一切由根开始。在Linux系统中 / 反斜杠表示根目录相对路径.开始或..开始符号/表示根(目录)~表示家(目录).表示当前(目录)..表示当前(目录)上一层-表示上一次进入的目录ls 命令作用:查看当前目录中的内容(可见)例子:/usr/local/nginxls -l就是以详细信息的方式显示目录的可见内容 use a long listing formatls -a想查看所有文件(可见 和 隐藏) all 所有 一般用于查看隐藏文件ls -al想查看所有文件(可见 和 隐藏) -all -list 所有 一般用于查看隐藏文件mkdir 命令作用:创建一个或多个(空的)目录例子:mkdir sec;mkdir day01;mkdir sec mca;扩展标识符合法标识符字母或下划线开头尽量不要出现中文(支持中文)简单 、易用、可读性高-p逐层的去创建mkdir -p day01/imagesrmdir 命令作用:删除一个空目录rm 命令作用:删除文件或目录rm -r递归删除/将目录以下的内容逐一删除 day01/imagesrm -f强制删除 不需要确认(谨慎 删库跑路必备技能)rm -i删除前逐一的询问确认touch 命令作用:创建文件的命令(空文件)例子:touch 文件名.扩展名 touch tokyo.avi; touch 喜欢你.mp3; touch FBI.py;cp 命令作用:复制文件或目录例子:cp a.txt aa.txt复制一个目录下面的所有内容:cp -r day04 day05mv 命令作用1:当前目录下操作是重命名作用2:相同/不同 移动文件或目录文件内容与编辑操作文件内容cat 命令作用:查看文件内容,从文件的第一行开始显示例子:cat a.txttac 命令作用:查看文件内容,从文件的最后一行开始显示例子:tac a.txtnl 命令作用:查看文件内容,并展示行号echo 命令作用:输出重定向例子1:覆盖的方式写入 echo "aaa" > to.txt例子2:追加的方式写入 echo "bbb" > to.txtmore 命令作用:查看文件内容,一页一页的显示,space键翻页例子:more to.txthead 命令作用:命令可用于查看文件的开头部分的内容,有一个常用的参数 -n 用于显示行数,默认为 10,即显示 10 行的内容例子:head to.txttail 命令作用:命令可用于查看文件的内容,有一个常用的参数 -f 常用于查阅正在改变的日志文件例子:tail -f to.txt文件编辑vim 命令作用:创建并编辑文件 例子:vim a.txtvim 文本编辑器命令模式(默认模式)命令模式(默认模式)i 从点前光标处开始插入文本命令模式(默认模式)I 从当前光标所在行,行首进行插入命令模式(默认模式)a 从当前光标处下一个字符开始插入文本命令模式(默认模式)A 从当前光标所在行的,行尾开始插入文本命令模式(默认模式)o从当前光标处的下一行开始插入文本命令模式(默认模式)O从当前光标处上一行开始插入文本快捷键命令上下左右光标键保存退出 ZZ 在命令模式ZZyy命令复制一行nyy命令复制多行; 例子:先輸入3,然後在輸入yy 就复制了3行p命令进行粘贴u命令进行撤销dd命令删除一行ndd命令删除多行gg命令光标在任意位置快速的移动到文件第一行行首GG命令光标在任意位置快速的移动到文件最后一行行首end快速到行尾编辑模式(插入模式)插入文本内容 , 按ESC,命令模式->编辑模式底行模式(命令行模式)按*:*进入到底行模式set nu ;设置显示行号w;仅仅保存wq;保存并且退出q;退出**q!**;强制退出文件,丢弃你所做的任何改动
总条数:1204 到第 页
上滑加载中