linux shell操作- 02 常用命令及案例

常用命令 续

  • 定时任务

    • 通过文本编辑cron任务,实现定时操作
      • 分 小时 天 月 星期 绝对路径sh or cmd
      • * 表示每个xxx,如每个小时
      • 每小时的第三分钟执行cmd-> 03 * * * * /home/lauf/scraw.sh
      • 每天的第5、8个小时执行-> 00 5,8 * * * cmd
      • 周日的每小时执行-> 00 */12 * * 0 cmd
      • 每天凌晨 -> 00 02 * * * cmd
      • 将任务写入 task.cron 文件中。
    • 执行定时任务 crontab task.cron
    • 或者 crontab <<EOF; xxxx; EOF
    • crontab -e 直接编辑定时任务
    • crontab -l 查看定时任务
    • crontab -r 直接移除所有任务
    • crontab -u 操作某用户的任务
    • 案例
      • 01 * * * * ls -l /home/laufing > log.txt
  • 查看信息

    • hostname,查看主机名信息;编辑主机名vim /etc/hostname
    • cat /etc/hosts 查看本地地址映射;
    • uname -a,查看内核信息
    • cat /proc/cpuinfo cpu信息
    • cat /proc/meminfo 内存
    • cat /proc/partitions 分区
    • cat /proc/version 发行版
    • /proc 在内存中存储进程信息,每个数字目录为一个进程;
    • which cmd 可执行文件的路径;同whereis,搜索PATH
    • whatis cmd 查看功能信息
    • who 当前登录的用户;whoami 当前终端用户;users; last 上次登录信息; uptime系统已运行时间;
  • 进程管理

    • ps 查看进程信息;
    • ps -ef ; every process , f 字段格式
    • ps -axf; 所有进程
    • ps -aux 当前用户的所有进程
    • ps -euf --sort ppid 当前用户的所有进程,并根据ppid排序;
    • ps -ef -o pcpu -o pmem -o comm -o user; 只输出指定列
    • ps -C xxx ; 根据进程名称获取信息
      • ps -C mysqld; 获取mysql 服务进程信息
    • ps -efL ; -L 同时输出线程信息,LWP为线程id
    • top 查看进程的系统资源占用情况
      • top -o %CPU 按CPU降序;
      • top -o %MEM 按内存降序
    • linux进程间通信,使用信号kill 向进程传递信号
      • kill -l 查看所有的信号
        [laufing@centos ~]$ kill -l
      1. SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR111) SIGSEGV12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+338) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+843) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+1348) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-1253) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-758) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-461) SIGRTMAX-3 62) SIGRTMAX-263) SIGRTMAX-1 64) SIGRTMAX
      • kill -s SIGKILL pid; 通过向进程传递SIGKILL信号 终止进程
      • kill -9 pid ;强制杀死进程
      • killall 类似pkill,根据进程名称杀死进程
      • Ctrl + C 向进程发送SIGINT信号;
      • 案例,编写一个脚本,使进程一直运行(事件循环), 关联处理函数与SIGINT信号,每次按Ctrl + C 打印输出。
        #!/bin/bash
        #handle function
        handler(){
        echo “ctrl + c pressed.”
        }
        #associate
        trap “handler” SIGINT
        while true;do
        echo running… > log.txt
        done

简单案例

  1. 编写shell脚本,输出当前用户是否为root用户。
#!/bin/bash
# 开启调试
set -x

# 数值比较 测试
if [ $UID -eq 0 ]; then
	echo "you are root."
else
	echo "you are common user."
fi

添加可执行权限:chmod u+x lauf.sh

  1. 编写shell脚本,接收命令行参数 m 、 n,输出 m n {m^n} mn
#!/bin/bash
# 变量直接赋值,一切值均为字符串
m=$1
n=$2
echo $m $n
echo -e "calc result:\n" # -e 有转义字符
echo "${m}^${n}" | bc

  1. 编写shell脚本,创建一个普通数组(‘tom’ ‘jack’ ‘lucy’),使用for循环遍历出每个元素。
#!/bin/bash

#!/bin/bash

arr=('tom' 'jack' 'lucy')
for((i=0; i < ${#arr[*]}; i++)){
    
     # 数组长度
    echo ${arr[i]}  # 普通数组,索引访问 arr[@] / arr[*] 获取所有的元素
    echo ${
    
    #arr[i]} # 每个元素的长度
}
  1. 编写shell脚本,存储水果的价格,apple: 3.4,pear: 2.3,banana: 2.8;命令行传参一个水果的名字,输出它的价格。
#!/bin/bash

# 声明关联数组,支持字符串索引,相当于python字典
declare -A price
price['apple']=3.4
price['pear']=2.3
price['banana']=2.8

echo "${price[$1]}"

# 命令行执行
$ ./lauf.sh  apple

 
5. 编写shell脚本,查看当前目录下占用磁盘空间最大的5个文件,并自定义一个命令,名为lauf,命令行下执行lauf命令即可执行脚本。

  • du -ah 查看磁盘使用情况
  • alias 定义命令别名,防止输入过长。命令行下临时生效,配置文件中永久生效
  • 开启调试模式
    • sh -x lauf.sh
    • #!/bin/bash -xv
    • set -x 写在脚本语句中 set +x 关闭调试
#!/bin/bash
du -ah | sort -nrk 1 | head -n 5

# sort 
# -n 数值排序
# -k 指定列
# -r 逆序排序

在这里插入图片描述
6. 编写shell脚本,要求用户输入用户名、密码,其中输入密码时不允许显示,最后打印用户名及密码,并统计程序执行的时间。

  • read 获取用户的输入,如 read password, 读取内容并存入password变量;
    read -p “提示:”,
    read -s 静默输入,不显示,
    read -n 读取指定数量的字符
  • stty -echo 不允许显示; stty echo 允许显示;
  • date 获取日期时间,date  +%s 获取时间戳, date +%a星期, date +%d日期,date +%b月份, date +%y/Y年,date +%H小时,date +%M分钟,date +%S秒
#!/bin/bash

# 计算开始时间
start=$(date +%s)   # (xxx) 子shell , 即子进程; $() 相当于``
# 输入用户名
read -p "input your name:" username
# 不显示
stty -echo
read -p "input your password:" password
# 显示
stty echo

# 输出
echo "your name: $username"
echo "your password: $password"
# 计算结束时间
end=$(date +%s)

# 计算差值
let delta=end-start
echo "total time: $delta s."

 
7. 编写shell,循环10次,每次延迟5s,计算程序执行总时间。

#!/bin/bash
start=$(date +%s)
for i in {
    
    1..10}; do
	sleep 5 # 休眠  命令行参数传入时间
	echo $i
done
end=$(date +%s)

delta=$[end-start]
echo "total time: $delta s."

猜你喜欢

转载自blog.csdn.net/weixin_45228198/article/details/132927877