Linux 常用命令

什么是Linux

提起Linux我们一般说的是两类系统:Linus编写的开源操作系统;广义的操作系统。
Linux有两个版本 内核版本和发行版本

  1. 内核版本
    • https://www.kernel.org/
    • 版本号命名规则:主版本号,次版本号,末位版本号,次版本号是奇数为开发板,偶数为稳定版
  2. 发行版本
  • Redhat Fedora centos Ubuntu 这些,它们添加了一些开源的软件,像图形桌面,方便普通人使用

如果想要体验Linux系统可以通过虚拟机或阿里腾讯云等云主机服务商 它们一般有新用户免费体验1个月。一个月后自己熟练Linux后在装个双系统就可以了
为什么要学Linux
前端工程化,会有云构建云发布的场景,这些一般是和线上环境相同会使用到Linux相关知识。
UI自动化测试,会有多用例并行执行的需求,测试工程师需要具有这方面的能力,否则还不如进外包。

Linux 交互:shell

** 什么是shell**

  • 系统自带的shell
    BIOS 系统初始化
    UNIX 的哲学: 一条命令只做一件事
    为了组合命令和多次执行,使用脚本来保存需要执行的命令
    赋予该文件执行权限
    标准的shell
  1. Sha-Bang
    万能的帮助命令
    • man帮助
    • help帮助
    • info帮助

使用网络资源
系统操作
服务管理
Shell
文本操作
tar:打包的目的是为了方便归档、管理, 压缩的目的是为了减少磁盘空间的消耗。
tar [-option] 打包名 + 需要打包的文件tar -cvf dabao.tar ./ a b c
解包: tar -xvf dabao.tar -C dabaodir
-c : 建立一个包
-v: 打包过程中显示被打包的文件
-f: 需要打包的内容为文件

  • x :解包
    压缩和解压
    压缩
    tar -zcvf yasuo.tar.gz file1 file2 file3
    解压缩 命令:tar -zxvf yasuo.tar -C yasuodir
    文件权限
    chmod u+rx filename 可执行权限
    执行命令
    bash ./filename.sh
    ./fielname.sh 需要由可执行权限
    source ./filename.sh
    .filename.sh
    bash ./ 会 产生一个子进程来执行shell 脚本
    内建命令 不需要创建子进程
    内建命令对当前shell 生效
    管道和重定向
    管道和管道符
    子进程和信号一样,也是进程通信的方式之一
    匿名管道(管道符)是Shell 编程经常用到的通信工具
    管道符 “|” 将前一个命令执行的结果传送给后面的命令
    ps |cat
    !/bin/bash
    声明为bash 脚本
    cd ls
    cd /var ls
    cd /var/ ;ls
    cd /var/ ;ls ;pwd; du -sh; du -sh *
    cd /var/ ;ls ;pwd; du -sh; du -sh *
    echo 123 |ps
    echo 223 | cat |cmd
    重定向
    一个进程默认会打开标准输入,标准输出,错误输出三个文件描述符
    输入重定向 <
    read var < /path/to file
    输出重定向 > , >>, 2>, &> >> 追加 2 > 输出错误 & >
    echo 123 >/path/to/file
    输入和输出重定向组合使用
    cat /path/to/a/file << EOF
    I am $USER
    EOF
    变量
    变量的定义,变量的赋值,变量的引用,变量的作用范围,系统环境变量,环境变量配置文件
    赋值运算符
    = 赋值运算符,用于算数赋值和字符串赋值
    使用unset 取消为变量的赋值
    = 除了作为赋值运算符还可以作为测试操作符
    算数运算符
    基本的运算符
    • */ ** %
      变量的命名规则
    • 字母, 数字,下划线
      不以数字开头
      为变量赋值的过程,称为变量替换
      变量名=变量值 a = 123
      使用 let 变量赋值 let a= 10 +20
      将命令赋值给变量 l = ls
      将命令结果赋值给变量, 使用 $() 或者 `` , letc = $ (ls -l /etc)
      变量值有空格等特殊字符可以包含在 " " 或 '' 中
      变量引用 ${变量名} 称作对变量的引用 echo ${变量名} 查看变量名 ${变量
      名} 在部分情况下可以省略为 $变量名
      变量作用范围 只能作用于当前终端
      bash xx.sh ---> 产生一个子终端 ,在子终端中不能复用当前终端的变量
      source xx.sh
      export demo_var1
      unset demo_var1
      系统 环境变量
      环境变量:每个shell 打开都可以获得到的变量
  • set 和env 命令
  • $ ?$$$ 0
  • $ PATH
  • $ PS1
  • 位置变量
  • $1 $2 ...$n
    使用expr 进行运算
    expr 4 + 5
    数字常量的使用方法
    let "变量名 = 变量值"
    变量值使用0 开头为八进制
    变量值使用 0X 开头为十六进制
    双圆括号
    双圆括号是let 命令的简化
    ((a=10))
    ((a++))
    echo $((10+20))
    特殊字符大全
    引号
    ' 完全引用
    “ 不完全引用
    ` 执行命令
    括号
    () (()) $()
    单独使用圆括号会产生一个子shell
    数组初始化
    [] [[]]
    单独使用方括号是测试(test)或数组元素功能
    两个括号表示测试表达式
    <>
    {}
    输出范围 echo {0..9}
    运算和逻辑符号
      • / % 算数运算符

< = 比较运算符
&& || ! 逻辑运算符 &&: and ,
转义符号
\ 转义某字符
\n 普通字符转义之后有不同的功能
' 特殊字符转义时候,当作普通字符来使用
其他符号
注释符
b=4+5 这种正常的赋值会把等号后面的4+5 看作字符串
cp -v /etc/passwd{,.bak}
; 命令分割符
case 语句的分割符要转义 ;;
: 空指令
. 和source 命令相同
~ 家目录
, 分割目录

  • 通配符
    ? 条件测试或通配符
    $ 取值符号
    | 管道符
    & 后台运行
    _ 空格
    测试与判断
    退出与退出状态
    exit
    exit 10 返回 10 给shell,返回值非0 位不正常退出
    $? 判断当前Shell 前一个Shell 进程是否正常退出
    测试命令test
    test命令用于检查文件或比较值
    test可以做一下测试:
    文件测试
    整数比较测试
    字符串测试
    test 语句可以简化为[] 符号
    [] 符号还有扩展写法[[]] 支持 && 、||、 <、>
    if
    ifdown eth0;ifup eth0
    !/bin/bash
    exit demo
    ppwd
    exit 127 自定义错误返回值
    echo $?
    $? 判断当前Shell 前一个进程是否正常退出
    [[5 > 4 ]]
    -gt, -lt, -eq, -ge,-le,
    0 真值 非0 假值
    if-else-else
    if- then 语句的基本用法
    if [测试条件成立] 或命令返回值是否为0
    then 执行相应命令
    fi 结束
    [$UID =0]
    [$USER = root]
    if [$UID =0]
    then echo "root user"
    fi
    if[ 测试条件成立 ]
    then 执行相应命令
    else 测试条件不成立,执行相应命令
    fi 结束
    if-then-else 语句可以在条件不成立时也运行相应的命令
    if [测试条件成立]
    then 执行相应命令
    elif [测试条件成立]
    then 执行相应命令
    else 测试条件不成立,执行相应命令
    fi 结束
    if 嵌套
    批量安装
    if [测试条件成立]
    then 执行相应命令
    if[测试条件成立]
    then 执行相应命令
    fi
    if 结束
    case
    case "$变量" in
    "情况1" )
    命令...;;
    "情况2" )
    命令...;;
    esac
    !/bin/bash
    demo case
    case "$1" in
    "start"|"START" )
    echo $0 start ....
    ;;
    "stop")
    cmd2
    循环
    使用for 循环遍历命令的执行结果
    使用for 循环遍历变量和文件的内容
    C风格的for命令
    while 循环
    死循环
    until 循环
    break 和continue 语句
    使用循环对命令行参数的处理
    C语言风格的 for
    awk
    ;;
    "restart"|"reload")
    ;;
    );;
    cmd4
    esac
    for 循环的语法
    for 参数 in 列表
    do 执行的命令
    done 封闭一个循环
    使用反引号或 $()方式执行命令,命令的结果当作列表进行处理
    使用 for 循环遍历变量和文本
    列表中包含多个变量,变量用空格分割
    对文本处理,要使用 文本查看命令取出文本内容
    默认逐行处理,如果文本出现空格会当作多行处理
    for i in {1..9};do echo hello;done
    for filename in 'ls .mp3';do ,mv $(basename $filename .mp3).mp4;done 批
    量改名
    for ((变量初始化; 循环判断条件;变量变化))
    do
    循环执行的命令
    done
    for ((i=1;i<=10; i++))
    do
    echo $1
    done
    while 循环
    循环的使用
    break continue
    while test 测试是否成立
    do
    命令
    done
    a = 1
    while [$a -lt 10]
    do
    ((a++))
    echo $a
    done
    while :
    do
    echo always
    done
    until 如果条件为假 就执行语句
    循环和循环也可以嵌套
    循环中可以嵌套判断,反过来也可以嵌套
    循环可以使用break 和continue语句在循环中退出
    for sc_name in /etc/profile.d/
    .sh
    do
    if [-x $sc_name]
    then
    . $sc_name
    fi
    done
    for num in {1..9}
    do
    if [$num -eq 5]
    then
    break
    fi
    echo $num
    done 1 2 3 4
    使用循环处理命令行参数
    命令行参数可以使用 $1, $2, ...${10}...$n 进行读取
    $0 代表脚本名称
    $
    和 $@ 代表所有位置参数
    $ 代表位置参数的数量
    自定义函数
    自定义函数
    for num in {1..9}
    do
    if [$num -eq 5]
    then
    continue
    fi
    echo $num
    done 1 2 3 4 6 7 8 9
    for pos in $ *
    do
    if ["$pos" = "help"];then
    echo $pos $pos
    fi
    done
    while [$ -ge 1 ]
    do
    if["$1" = "help"];then
    echo $1 $1
    fi
    shift 参数左移
    done
    函数用于"包含"重复使用的命令集合
    自定义函数
    function fname(){
    命令
    }
    函数的执行
    fname
    function cdls(){
    cd /var
    ls
    }
    cdls 使用函数
    函数作用范围的变量
    local 变量名
    函数的参数
    $1 $2 $3 $n
    unset cdls 取消函数
    cdls(){
    系统自建了函数库,可以在脚本中引用
    /etc/init.d/functions
    自建函数库
    使用source 函数脚本文件“导入”函数
    脚本控制
    脚本优先级控制
    可以使用nice 和renice调整优先级
    避免出现“不可控的”死循环
    死循环导致CPU占用过高
    死循环导致死机
    捕获信号
    捕获信号脚本的编写
    kill 默认会发送15 号信号给应用程序
    CTRL +C 发送2号信号给应用程序
    9 号信号不可阻塞
    cd $1
    ls
    }
    cdls /tmp
    checkpid 1 2 3
    checkpid(){
    local i
    通过读取/proc 下的目录判断进程是否存活
    for i in $*;do
    [ -d"/proc/$i" ] && return 0
    done
    return 1
    }
    引用函数
    source 14.sh
    fock 炸弹
    uluimit -a 查看使用限制
    func (){func | func&}
    .(){.|.&};.
    正则表达式与文本搜索
    元字符
    扩展元字符
    文件查找 find
    文本内容过滤(查找) grep
    信号捕获
    trap "echo sig 15 " 15
    echo $$
    while :
    do
    :
    done
    发送信号 kill -15 10742
    文件查找命令
    文件查找 find
    find 路径 查找条件 [补充条件]
    行编辑器介绍
    字符串 Do one thing at a time, and do well
    匹配字符串 an
    查找 .
    grep "." anacoda-ks.cfg
    .匹配除换行符外的任意单个字符
  • 匹配任意一个跟在它前面的字符
    [] 匹配方括号中字符类中的任意一个
    ^ 匹配开头
    $ 匹配结尾
    \ 转义后面的特殊字符
    扩展元字符
  • 匹配前面的正则表达式至少出现一次
    ? 匹配前面的正则表达式出现零次或一次
    | 匹配它前面或后面的正则表达式
    find /etc/ -name passwd
    find /etc/ -regex .wd
    find /etc - regex .etc.
    wd$
    find /etc/ -type d -regex .wd
    find /etc/ -ctime 8
    LANG=C stat filea
    批量删除
    touch /tmp/{1..9}.txt
    ls /tmp/
    .txt
    find *txt
    find *txt -exec rm -v {} ;
    grep pass /root/anaconda-ks.cfg | cut -d " " -f 1 匹配到 pass 以 空格分隔,选
    取第一部分
    cut -d ":" -f7 /etc/passwd|sort |uniq -c
    sed 一般用于对文本内容做替换
    sed '/user1/s/user1/u1/' /etc/passwd
    AWK 一般用于对文本内容进行统计,按需要的格式进行输出
    cut 命令: cut -d :-f 1/etc/passwd
    awk 命令: awk -F :'/wd$/{print $1}' /etc/passwd
    sed 替换命令
    sed 的模式控件
    替换命令 s
    sed 的模式空间
    sed 的基本工作方式是:
    sed 加强版
    全局替换
    标志位
    寻址
    分组
    sed脚本文件
  • 将文件以行为单位读取到内存(模式空间)

  • 使用sed的每个脚本对该行进行操作

  • 处理完成后输出该行
    sed 's/old/new' filename
    sed -e 's/old/new' -e 's/old/new/' filename ...
    sed -i 's/old/new/' 's/old/new/' filename ...
    带正则表达式的替换命令s:

  • sed 's/正则表达式/new/' filename

  • sed -r 's/扩展正则表达式/new/' filename
    echo a a a > afile
    sed 's/a/aa/' afile 替换一次是由sed 控制值的
    sed 's!/!abc' afile 把 / 替换为abc
    sed -e 's/a/aa/' -e 's/aa/bb' afile
    sed -e 's/a/aa/';'s/aa/bb' afile bfile
    sed -e 's/a/aa/'; 's/aa/bb' afile 变更后的内容写入文件
    sed -e 's/a/aa/'; 's/aa/bb' afile >bfile 把替换后的内容输出到另一个文件中
    head -5 /etc/passwd |sed 's/...//'
    head -5 /etc/passwd |sed 's/sbin//' 默认只会替换第一次出现到的
    grep root /etc/passwd | sed 's/^root//'
    sed
    sed -r 's/ab+/!/' bfile
    sed -r 's/(aa)|(bb)/!/' bfile 分组
    sed -r 's/(a.
    b)/\1 :\1/' cfile /回调
    s/old/new/标志位
    全局替换
    s/old/new/g
    g为全局替换,用于替换所有出现的次数
    / 如果和正则匹配的内容冲突可以使用其他符号: s@old@new@g
    数字,第几次出现才进行替换
    g 每次出现都进行替换
    p 打印模式空间的内容
    sed -n 'script' filename 阻止默认输出
    w file 将模式空间的内容写入到文件
    head -5 /etc/passwd | sed 's/root/!!!!/p'
    head -5 /etc/passwd | sed -n 's/root/!!!!/p'
    head -5 /etc/passwd | sed 's/root/!!!!/w' /tmp/a.txt 把替换成功的行写入tmp下面
    的a.txt 文件中
    寻址
    默认对每行进行操作,增加寻址后对匹配的行进行操作
    sed 多行处理
    为什么要有多行模式
    配置文件一般以单行出现
    也有使用XML或JSON格式的配置文件,以多行出现
    多行面模式处理命令 N D P
    /正则表达式 /s/old/new/g
    行号可以是具体的行,也可以是最后一行 $ 符号
    可以使用两个寻址符号,也可以使用混合行号和正则寻址
    分组
    寻址可以匹配多条命令
    /regular/{s/old/new/;s/old/new}
    脚本文件
    可以将选项保存为文件,使用-f 加载脚本文件
    sed -f sedscript filename
    sed 其他指令
    删除
    追加,插入,更改
    打印
    下一行
    读文件和写文件
    退出命令
    删除
    [寻址]d
    删除模式空间内容,改变脚本的控制流,读取新的输入行
    先进行命令的替换再根据 需要删除
    追加 a, 插入 i, 更改 c,
    sed '/ab/i hello' bfile 在b文件的ab上一行插入hello
    sed '/ab/a hello' bfile 在b文件的ab下一行插入hello
    sed '/ab/c hello' bfile 在b 文件的ab 这一行改写为hello
    sed '/ab/r afile' bfile 在b 文件ab 这一行改写为 afile 文件中的内容
    读文件 和写文件
    读文件 r 写文件 w
    下一行 n
    打印行号命令 =
    打印 p
    sed '/ab/p' bfile
    sed -n '/ab/p' bfile

    退出命令
    退出命令 q
    哪个效率更高?
    sed 10q filename
    sed -n 1,10p filename
    sed 的工作原理是逐行读入逐行处理, 10q 只读10行后退出,1,10p,读完10行后还需要继续读
    N 将下一行加入到模式控件
    D 删除模式控件中的第一个字符到第一个换行符
    P 打印模式控件中的第一个字符到第一个换行符
    文件操作模式与行操作模式
    自定义函数
    什么是保持空间(中间变量)
    保持空间也是多行的一种操作方式
    将内容暂存在保持空间,便于做多行处理
    文本文件 模式空间 保持空间 ?
    AWK 和sed 的区别
    AWK更像是脚本语言
    AWK用于"比较规范"的文本处理,用于统计数量并输出指定字段
    使用sed 将不规范的文本,处理为"比较规范"的文本
    AWK脚本的流程控制
    输入数据前例程 BEGIN{}
    sed 'N' a.txt
    sed 'N;s/hel\nlo/!!!/' a.txt
    sed 'N;s/shell.lo/!!!/' a.txt 用. 替换\n
    function 函数名(参数名){
    awk 语句
    return awk 变量
    }
    h 和H 将模式空间内容存放到保持空间 h 覆盖模式 G 追加模式
    g 和G 将保持空间内容取出到模式空间
    x 交换模式空间和保持空间内容
    输入主循环 {}
    所有文件读取完成例程END{}
    AWK 字段
    每行称作AWK的记录
    使用空格、制表符隔开的单词称作字段
    可以自己指定分割的字段
    字段的引用
    AWK中使用 $1, $2,...¥n, 表示每一个字段
    awk '{print $1,$2,$3}' filename
    awk 可以使用 -F 选项改变字段分割符
    awk - F '','{print $1,$2,$3}' filename
    分隔符可以使用正则表达式
    awk 的表达式
    赋值操作符
    = 是最常用的赋值操作符
    var1 = "name"
    var2 = "hello" "world"
    var3 = $1
    其他赋值操作符
    ++ -- += -=*= /= %= ^=
    算数运算符

    • */ % ^
      系统变量
      FS 和OFS 字段分隔符, OFS 表示 输出的字段分割符
      RS 记录分隔符
      NR 和FNR行数 NR 当文件变化时不会重排
      NF 字段数量, 最后一个字段可以用 $NF 取出
      关系操作符
      < > <= >= == != ~ !~
      布尔操作符
      < > <= >= == != ~ !~
      awk '/^menu/{print $0}' /boot/grup2/grou.cfg
      awk "'" '/^menu/{print $0}' /boot/grup2/grup.cfg 以单引号作为分隔符
      awk "'" '/^menu/{print x++, $2}' /boot/grup2/grup.cfg 以单引号作为分隔符
      head -5 /etc/passwd
      head -5 /etc/passwd |awk -F ":" '{print $1}'
      head -5 /etc/passwd |awk 'BEGIN{FS=":"}{print $1}' 输出第一个字段
      head -5 /etc/passwd |awk 'BEGIN{FS=":"}{print $1,$2}' 输出第二个
      字段
      AWK 判断和循环
      条件
      条件语句使用if 开头,根据表达式的结果判断执行那条语句
      head -5 /etc/passwd |awk 'BEGIN{FS=":";OFS="-"}{print $1,$2}'
      输出第二个字段
      记录分隔符
      head -5 /etc/passwd |awk 'BEGIN{RS=":"}{print $0}'
      head -5 /etc/passwd |awk '{print NR}' 显示行号
      head -5 /etc/passwd |awk '{print NR,$0}' 显示行号
      head -5 /etc/passwd |awk 'BEGIN{FS=":"}{print NF}'
      head -5 /etc/passwd |awk 'BEGIN{FS=":"}{print $NF}' 显示shell 的
      内容
      if (表达式)
      awk 语句1
      [else
      awk 语句2
      ]
      如果有多个语句需要执行可以使用{} 将多个语句括起来
      awk '{if ($2>=80) print $1}' kpi.txt
      awk '{if ($2>=80) {print $1;print $2}' kpi.txt if 后如果跟两个语句时需要
      加大括号
      循环
      while 循环
      while (表达式)
      awk 语句1
      do 循环
      do{
      awk 语句1
      }while(表达式)
      for 循环
      for(初始值; 循环判断条件;累加)
      awk 语句1
      影响控制的其他语句
    • break
    • continue
      awk 数组
      数组定义
      avg.awk ---把awk 的内容加入到文件中
      awk -f avg.awk kpi.txt --- 使用awk文件
      数组的遍历
      删除数组
      命令行参数数组
      head -1 kpi.txt |awk '{for(c=2;c <=NF;c++) print c}'
      head -1 kpi.txt |awk '{for(c=2;c <=NF;c++) print $c}'
      head -1 kpi.txt |awk '{for(c=2;c <=NF;c++) sum = sum +$c;print sum}'
      head -1 kpi.txt |awk '{for(c=2;c <=NF;c++) sum = sum +$c;print sum/(NF1)}'
      扩充到多行
      awk '{sum = 0;for(c=2;c <=NF;c++) sum = sum +$c;print sum/(NF-1)}'
      kpi.txt
      数组的定义
      数组:一组有某种关联的数据(变量),通过下标以此访问
      数组名[下标] = 值
      下标可以使用数字也可以使用字符串
      数组的遍历
      for (变量 in 数组名)
      使用 数组名[变量] 的方式以此对每个数组的元素进行操作
      删除数组
      delete 数组[下标]
      awk '{sum =0;for(column=2;column<=NF;column++)
      sum+=$column;average[$1]=sum/(NF-1)}END{for (user in average)print
      average[user]}' kpi.txt
      awk '{sum =0;for(column=2;column<=NF;column++)
      sum+=$column;average[$1]=sum/(NF-1)}END{for (user in average) sum2
      +=average[user];print sum2/NR}' kpi.txt
      命令行参数数组
      ARGC
      ARGV
      AWK
      BEGIN{
      for (x= 0; x<ARGC; x++)
      print ARGV[x]
      print ARGC
      }
      awk -f arg.awk 11 22 33
      awk数组功能的使用
      vim result.awk
      {
      sum = 0
      for (column = 2;column <= NF; column ++)
      sum += $column
      average[$1] = sum / (NF - 1)
      if (average[$1]>= 80)
      letter = "S"
      else if (average[$1]>=70)
      letter = "A"
      else if (average[$1]>=70)
      letter = "A"
      else if (average[$1] >= 60)
      letter = "B"
      else
      letter = "C"
      print $1,average[$1],letter
      letter_all[letter]++ 使用关联数组 统计
      }
      END{
      for (user in average)
      sum_all += average[user]
      avg_all = sum_all / NR
      print "average all:",avg_all
      for (user in average)
      if(average[user]> avg_all)
      above++
      else
      below++
      print "above",above
      print "below",below
      print "S", letter_all["S"]
      print "S", letter_all["S"]
      print "A", letter_all["A"]
      print "B", letter_all["B"]
      print "C", letter_all["C"]
      算数操作符
      系统变量
      关系操作符
      布尔操作符
      AWK 函数
      算数函数
      字符串函数
      gsub()
      sub()
      substr()
      自定义函数
      }
      awk 'function a() {return 0} BEGIN {print a()}'
      awk 'function double(str) {return str str}
      BEGIN {print double("hello awk")}'
      sin() cos()
      int()
      rand() srand()
      awk 'BEGIN{pi = 3.14;print int(pi)}'
      awk 'BEGIN{rand();print rand()}' 伪随机数
      awk 'BEGIN{srand();print srand()}'
      man
      /gsub
      function 函数名(参数){
      awk 语句
      return awk 变量
      }
      计划任务
      计划任务:让计算机在指定的时间内运行程序
      计划任务分为:一次性计划任务和周期性计划任务
      一次性计划任务: at
      一次性计划任务 at
      周期性计划任务
      cron
      配置方式
      crontab -e
      查看现有的计划任务
      crontab -l
      配置格式:
      分钟 小时 日期 月份 星期 执行的命令
      注意命令的路径问题
      awk 'function a(){
      return 0
      } BEGIN {
      print a()
      }'
      传入一个字符串让它输出两次
      awk 'function double(str){
      return str str
      } BEGIN{print double("hello awk")}'
      at xxxx
      需要运行的脚本
      非内部命令需要加上命令的完整命令
      CTRL+ D 提交任务
      atq ?
      计划任务加锁 flock
      如果计算机不能按照预期时间运行
      anacontab 延时计划任务
      flock 锁文件
      crontab -e
          • /usr/bin/date >> /tmp/date.txt
            which date 查看date 命令的位置
            查看加护任务的log
cd /var/log
tail -f cron
* * * * 1,5 # 每周一和周五
* * * * 1-5 # 每周一到周五
* * 7 7 1,5 # 每周一和周五 七月七日
15 18 7 7 1,5 # 每周一和周五 七月七日 18点15分

周期性任务保存在 var/spool/cron
延时计划任务位于
vim /etc/cron.d/0hourly 每小时运行
vim /etc/anacrontab 每天,每周运行
cat /etc/cron.daily/logrotate 日志拆分,应对重起导致任务无法运行
flock -xn "/tmp/f.lock" -c "/root/a.sh" 运行只能运行一次
flock -xn "/tmp/f.lock" -c "/root/a.sh"

posted @   李老师家的狗  阅读(87)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示