linux运维

linux软件管理,定时任务及sed命令示例

2018-03-13  本文已影响25人  dabule

简述rpm与yum命令的常见选项,并举例

rpm命令:rpm [OPTIONS] [PACKAGE_FILE]

rpm是一款强大的包管理工具可以实现安装、升级、卸载、查询和校验、数据库维护
1. 安装:-i, --install

rpm {-i|--install} [install-options] PACKAGE_FILE ...
          -v:显示详细过程
          -h:输出进度条(#)
          --test:测试安装,检查并报告依赖关系及冲突消息等
          --nodeps:忽略依赖关系,忽略依赖关系的包可能会出现各种问题,不建议使用.
          --replacepkgs:重新安装
          --nosignature:不检查包签名信息及源合法性(--这也是一个危险的操作--)
          --nodigest:不检查包完整性信息
[root@localhost Packages]# rpm -ivh zsh-5.0.2-7.el7.x86_64.rpm 
warning: zsh-5.0.2-7.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                          ################################# [100%]
    package zsh-5.0.2-7.el7.x86_64 is already installed

2.升级或安装:-U, --update

rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
         --oldpackage:降级
         --force:强制升级
[root@localhost Packages]# rpm -Uvh zsh-5.0.2-7.el7.x86_64.rpm 
warning: zsh-5.0.2-7.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
Preparing...                          ################################# [100%]
    package zsh-5.0.2-7.el7.x86_64 is already installed

程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供
Linux支持多内核版本并存,可以直接安装新版本内核,不要对内核做升级操作

3. 升级: -F, --freshen
-F只能升级不能进行安装操作

rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
         --oldpackage:降级
         --force:强制升级
[root@localhost Packages]# rpm -Fvh zsh-5.0.2-7.el7.x86_64.rpm 
warning: zsh-5.0.2-7.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY

4. 卸载:-e, --erase

rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...
            
        --allmatches:卸载所有匹配指定名称的程序包的各版本;
        --nodeps:忽略依赖关系
        --test:测试卸载,干跑(dry run)模式
[root@localhost Packages]# rpm -evh zsh
Preparing...                          ################################# [100%]
Cleaning up / removing...
   1:zsh-5.0.2-7.el7                  ################################# [100%]


5. 查询:-q, --query
查询指定的程序包是否已经安装,及其版本号

rpm {-q|--query} [select-options] [query-options]
          [select-options]
                -a:查询所有已经安装过的包;
                -f  FILE:查询指定的文件由哪个程序包安装生成
                -p, --package PACKAGE_FILE:查询未安装的程序包
                --whatprovides CAPABILITY:查询指定的功能由哪个程序包提供
                --whatrequires CAPABILITY:查询指定的功能被哪个包所依赖
            
         [query-options]
                --changelog:查询rpm包的更新日志
                -l, --list:程序安装生成的所有文件列表
                -i, --info:程序包相关的信息
                -c, --configfiles:查询指定的程序包提供的配置文件
                -d, --docfiles:查询指定的程序包提供的文档
                --provides:列出指定的程序包提供的所有的功能
                -R, --requires:查询指定的程序包的依赖关系
                --scripts:查看程序包自带的脚本(程序不一定都有自带脚本)
[root@localhost Packages]# rpm -qpR zziplib-0.13.62-5.el7.x86_64.rpm 
warning: zziplib-0.13.62-5.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID fd431d51: NOKEY
/sbin/ldconfig
/sbin/ldconfig
libc.so.6()(64bit)
libc.so.6(GLIBC_2.14)(64bit)
libc.so.6(GLIBC_2.2.5)(64bit)
libc.so.6(GLIBC_2.3.4)(64bit)
libc.so.6(GLIBC_2.4)(64bit)
libc.so.6(GLIBC_2.7)(64bit)
libz.so.1()(64bit)
libzzip-0.so.13()(64bit)
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)
rpmlib(PayloadIsXz) <= 5.2-1

6. 校验:-V, --verify

 rpm {-V|--verify} [select-options] [verify-options]    
             S: 程序包文件大小改变
             M: 权限改变 (包括许可权限和文件类型)
             5: MD5码改变 
             D: 设备的主/次设备号不匹配
             L: 实际链接路径不匹配
             U: 属主关系改变
             G: 属组关系改变
             T: mTime改变
             P: 功能改变,(可以rpm -q --provides 包名 查询)
     [verify-options]   
             --nodeps:不校验依赖性
             --nosignature:不校验包完整性
             --noscripts;不校验脚本
               ...
[root@localhost tmp]# rpm -V zsh
S.5....T.    /usr/share/zsh/5.0.2/functions/zsh-mime-setup

7. 数据库维护:--builddb, --initdb

不同版本获取帮助的方法:
CentOS 6:man rpm
CentOS 7:man rpmdb

rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]
  --initdb:初始化数据库,当前无任何数据库可实始化创建一个新的;当前有时不执行任何操作;
  --rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建

  --dbpath DIRECTORY:指定数据的存放路径
[root@localhost tmp]# mkdir /tmp/dbtest
[root@localhost tmp]# rpm --initdb --dbpath /tmp/dbtest/
[root@localhost tmp]# ls dbtest/
Basenames     __db.002  Group       Obsoletename  Requirename  Triggername
Conflictname  __db.003  Installtid  Packages      Sha1header
__db.001      Dirnames  Name        Providename   Sigmd5

yum命令:

yum [options] [command] [package ...]
     [options]
       -y: 自动应答
       -q:静默模式
       --noplugins: 禁用程序包插件
       --disablerepo=repoidglob:临时禁用给定的epo
       --enablerepo=repoidglob:临时启用给定的repo
       --nogpgcheck:不做gpgcheck检查
     [command]
        install:安装
        update:升级
        remove:卸载
        list:列出指定程序包
        clean:清理本地缓存
        makecache:构建缓存
        search:搜索
        repolist:列出所有(在用,停用的)的yum.repo
  等等选项,详见man yum

yum的repo配置文件中可用的变量说明:
$releasever: 当前OS的发行版的主版本号
$arch: 平台,如:i386 i486等类型
$basearch:基础平台

自建yum仓库,分别为网络源和本地源

本地源配置:

本示例使用光盘做本地yum源,应保证有对应版本的镜像包并且光盘能正常挂载系统,也可以从镜像网站下载好rpm包之后使用createrepo命令创建本地yum源.
1.创建本地光盘挂载目录:/mnt/media.repo

 mkdir -p /mnt/media.repo

2.将本地光盘挂在到/mnt/media.repo

 临时挂载
 mount  /dev/cdrom  /mnt/media.repo
 永久挂载
 echo "/dev/cdrom  /mnt/media.repo iso9660 defaults 0 0" >> /ect/fstab

3.编辑本地yum源配置文件

yum配置文件在/etc/yum.repos.d/目录下,并且以.repo结尾的文件

  [base]    
  name=media   
  baseurl=file:///mnt/media.repo   
  gpgcheck=0   #gpg检验,0表示不检验,如果是1还要提供gpgkey
  enabled=1    #是否启用1表示启用

4.检验配置yum源是否配置成功

将配置文件保存退出后就可以验证了,具体操作如下:

[root@localhost Packages]# yum makecache 
Loaded plugins: langpacks, product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
media                                                           | 4.1 kB  00:00:00     
Metadata Cache Created
----------------------------------分割线----------------------------------

[root@localhost Packages]# yum repolist
Loaded plugins: langpacks, product-id, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
repo id                                  repo name                               status
media                                    media                                   4,305
repolist: 4,305
#这里看到media有4305个rpm包证明本地yum配置成功

网络源配置:

配置网络源要保证linux系统能连接网络
1、备份本地yum源

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup

2、下载新对应的CentOS-Base.repo 到/etc/yum.repos.d/
要根据自己的版本来下载,高版本的linux不能使用低版本的yum源,阿里的yum源地址:https://opsx.alibaba.com/mirror

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

3、之后运行yum makecache生成缓存
makecache成功则网络yum源成功配置

简述at和crontab命令,制定 每周三凌晨三、五点10分执行某个脚本,输出当前时间,时间格式为 2017-12-28 10:00:00

at命令:

at是单次执行一个任务,不能周期性的自动执行

at  [OPTION]... TIME        
       TIME:
         HH:MM [YYYY-mm-dd]
         teatime: 下午4点
         tomorrow:第二天
         now+# :从现在起+多少时间
         常用单位:minutes, hours, days, weeks   
     常用选项:
         -l:查看作业队列,
         -f /文件名:从指定文件中读取作业任务
         -d:删除指定的作业,
         -c:查看指定作业的具体内容;
         -q QUEUE:指明队列;
[root@localhost test]# at -f /tmp/test/date.sh 3:10
job 1 at Mon Mar 12 03:10:00 2018

crontab命令

crontab是周期性执行指定任务的命令
crontab有系统的配置文件和用户自己的配置文件具体的路径如下:
系统cron的配置格式:/etc/crontab
用户cron的配置格式:/var/spool/cron/USERNAME
如下示例可以看到系统的cron的配置

[root@localhost Packages]# vim /etc/crontab 

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root

# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 - 59) 每分钟数范围是0-59
# |  .------------- hour (0 - 23)  每小时数范围是0-23
# |  |  .---------- day of month (1 - 31)  一个月的天范围是0-31
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...每个月数范围时1-12
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat每星期的天数0-6(0和7都代表星期日)
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed  用户名   要执行的命令(使用绝得路径如: /bin/bash)

注意事项:
day of month和day of week 最好不要一起定义,定义其中一个就好
指定的 */# 不能被整除时 如: */7 * * * * root /bin/echo "hiya" 因为一分钟不能整除7在一分钟之后将不是每隔7分钟执行一次操作了
运行结果以邮件通知给当前用户
某任务在指定的时间因关机未能执行,下次开机到达指定的时间并不会自己再执行该任务
如果执行的命令中有%符号要注意转义.可以将命令放在脚本里.
最小时间单位为“分钟”,不能精确到秒钟,可以利用脚本实现在每分钟之内,循环多次
*:代表每个时间. #,#,#:表多个离散的时间. #-#:表示一段连续的时间. */# :表示步长,要能被整除才有意义

*/2 * * * *:每2分钟执行一次某任务
0 9-15 * * 6-7: 每周末的9点到15点整执行某任务
crontab [-u user] [-l | -r | -e] [-i] 
             -e:编辑任务
             -l:列出所有任务
             -r:移除所有任务
             -i:在使用-r选项移除所有任务时提示用户确认;
            -u user:root用户可为指定用户管理cron任务
1.设置脚本
[root@localhost test]# vim date.sh

#!/bin/bash

date "+%F %H:%M:%S"
-----------------------------------------------------
2.设置crontab
[root@localhost test]# crontab -e
no crontab for root - using an empty one

10 3,5 * * 0-6 /bin/bash /tmp/test/date.sh
-----------------------------------------------------
3.查看crontab
[root@localhost test]# crontab -l
10 3,5 * * 0-6 /bin/bash /tmp/test/date.sh

简述sed常用操作命令,并举例

sed:Stream EDitor,流编辑器

sed是一种非交互式的行编辑器,一次把当前行的内容放入"模式空间"
中,然后用sed命令处理"模式空间"里的内容,处理完毕后输出到标准输
出,接着处理下一行,一直到文件末尾.

sed默认的处理过程并不会改变对象文件的原有内容,除非使用重定向等方式来储存结果

sed [OPTION]...  'script'  [input-file] ...
    常用选项:
        -n:不输出模式空间中的内容至屏幕
        -e script, --expression=script:多点编辑
        -f /PATH/TO/SED_SCRIPT_FILE 从脚本里读取编辑命令,每行一个编辑命令
        -r, --regexp-extended:支持使用扩展正则表达式
        -i [SUFFIX], --in-place[=SUFFIX]:直接编辑原文件 (会破坏源文件内容)

    script:
        地址定界编辑命令        
    地址定界:
        (1) 空地址:对全文进行处理
        (2) 单地址:
            #:指定行
            /pattern/:被此模式所匹配到的每一行
        (3) 地址范围
            #,#:从第几行到第几行匹配到的所有行
            #,+#:从几行+几行匹配到的所有行
            #,/pat1/ 从第几行到被pat1/ 匹配到的所有行
            /pat1/,/pat2/ 从/pat1/到/pat2/匹配到的所有行
            $:最后一行
        (4) 步进:~
            1~2:所有奇数行
            2~2:所有偶数行
            
    编辑命令:
        d:删除匹配到的行
        p:显示模式空间中的内容
        a \text:在行后面追加文本“text”,在text后面加\n new text来实现多行追加
        i \text:在行前面插入文本“text”,支在text后面加\n new text来实现多行插入
        c \text:把匹配到的行替换为成“text”(整行替换)
        w /FILE:保存模式空间匹配到的行至指定的文件中(覆盖模式保存)
        r /FILE:读取指定文件的内容至当前文件被模式匹配到的行后面实现文件合并功能
        =:为模式匹配到的行打印行号
        !:条件取反.用法:放在地址定界与编辑命令之间,格式如:        地址定界!编辑命令
        s///:查找替换,默认只替换第一次匹配到的行,其分隔符可自行指定,常用的有s@@@, s###等
            替换标记:
                g:全局替换
                w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中()
                p:显示替换成功的行
[root@localhost tmp]# sed 's@^#[[:space:]]*@@' fstab

/etc/fstab
Created by anaconda on Sun Mar 11 07:33:07 2018

Accessible filesystems, by reference, are maintained under '/dev/disk'
See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=9d1faf64-5990-40c7-80d2-33112997dcc9 /boot                   xfs     defaults        0 0
/dev/mapper/centos-home /home                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
/dev/cdrom /mnt/media.repo iso9660 defaults 0 0
--------------------------------分割线--------------------------------
[root@localhost test]# cat sedtest.txt   #这是原文件文件
hello,hello,hello,hello,hello,hello
hello,hello,hello,hello,hello,hello
hello,hello,hello,hello,hello,hello
hello,hello,hello,hello,hello,hello
--------------------------------分割线--------------------------------
[root@localhost test]# sed -n '1 s@h@H@p' sedtest.txt   #替换第一行的第一次匹配到的字符,并显示该行
Hello,hello,hello,hello,hello,hello
--------------------------------分割线--------------------------------
[root@localhost test]# sed -n '1 s@h@H@gp' sedtest.txt  #全局替换匹配到的行并显示
Hello,Hello,Hello,Hello,Hello,Hello
--------------------------------分割线--------------------------------
[root@localhost test]# sed  '1 a1\n2\n3' sedtest.txt   #匹配到的行后面实现多行追加并显示
hello,hello,hello,hello,hello,hello
1
2
3
hello,hello,hello,hello,hello,hello
hello,hello,hello,hello,hello,hello
hello,hello,hello,hello,hello,hello

--------------------------------分割线--------------------------------
[root@localhost test]# sed  '1 i1\n2\n3' sedtest.txt   #匹配到的行前面实现多行插入并显示
1
2
3
hello,hello,hello,hello,hello,hello
hello,hello,hello,hello,hello,hello
hello,hello,hello,hello,hello,hello
hello,hello,hello,hello,hello,hello
--------------------------------分割线--------------------------------
[root@localhost test]# sed  '1~2 c3\n5\n6' sedtest.txt   #奇数行实现多行替换并显示
3
5
6
hello,hello,hello,hello,hello,hello
3
5
6
hello,hello,hello,hello,hello,hello
     高级编辑命令:
         h:把模式空间中的内容覆盖至保持空间中
         H:把模式空间中的内容追加至保持空间中
         g:把保持空间中的内容覆盖至模式空间中
         G:把保持空间中的内容追加至模式空间中
         x:把模式空间中的内容与保持空间中的内容互换
         n:覆盖读取匹配到的行的下一行至模式空间中
         N:追加读取匹配到的行的下一行至模式空间中
         d:删除模式空间中的行
         D:删除多行模式空间中的所有行
--------------------------------分割线--------------------------------
[root@localhost test]# cat sedtest.txt   #这是原文件
1.hello,hello,hello,hello,hello,hello
2.hello,hello,hello,hello,hello,hello
3.hello,hello,hello,hello,hello,hello
4.hello,hello,hello,hello,hello,hello
--------------------------------分割线--------------------------------
[root@localhost test]# sed  '2~2 N;d' sedtest.txt 
4.hello,hello,hello,hello,hello,hello
--------------------------------分割线--------------------------------
[root@localhost test]# sed -n '$!G;H;p' sedtest.txt
1.hello,hello,hello,hello,hello,hello

2.hello,hello,hello,hello,hello,hello

1.hello,hello,hello,hello,hello,hello

3.hello,hello,hello,hello,hello,hello

1.hello,hello,hello,hello,hello,hello

2.hello,hello,hello,hello,hello,hello

1.hello,hello,hello,hello,hello,hello

4.hello,hello,hello,hello,hello,hello
--------------------------------分割线--------------------------------
[root@localhost test]# sed -n 'n;x;p' sedtest.txt

2.hello,hello,hello,hello,hello,hello
--------------------------------分割线--------------------------------
[root@localhost test]# sed -n 'n;p' sedtest.txt
2.hello,hello,hello,hello,hello,hello
4.hello,hello,hello,hello,hello,hello
上一篇下一篇

猜你喜欢

热点阅读