SHELL编程

01 为什么需要学shell编程_哔哩哔哩_bilibili

目录

什么是shell

​编辑

Shebang 

CentOS支持多种Shell

运行shell脚本的命令

查看历史命令的相关命令

创建新用户

几个简单的Shell内置命令

Shell内置命令和外置命令

变量

定义变量、单双反引号和$()的区别

变量作用域 

环境变量设置

远程登录linux服务器如何设置终端失效时间

环境变量初始化与加载顺序

查看环境变量的命令

删除变量

定义只读变量

shell特殊‘获取参数’变量 和 for语句

shell特殊‘获取状态’变量

变量子串的用法

统计变量值长度${#name}

最快的方式

wc命令

expr命令(接收以空格分割的参数)

awk命令

if语句

扩展变量 和 find命令

BASH多命令一步执行

vim中如何粘贴、设置行号等

nohup和>/dev/null 2>&1 & 

一、背景说明:

二、命令解析:

三、指定输出文件:

四、sh xxx.sh与./xxx.sh区别:

五、补充

for循环

seq命令-生成序列

time命令-统计命令执行时长

mv命令

批量创建文件&批量修改文件名

父子shell

数学运算脚本开发 

数学运算基础学习-双小括号$(( ))计算等

sed命令-字符串替换

开发一个接收用户输入数值并计算的脚本,判断输入是否合法:

Let运算命令

 $[]计算

awk命令(支持小数计算)

bc命令(支持小数计算)

tr命令(替换字符、删除字符等)

把空格替换为+

网址服务状态监测脚本

read命令

条件测试

test命令条件测试

选项参数

硬连接和软链接

条件1  &&  条件1成立要执行的操作  ||  条件1不成立要执行的操作

通过test命令判断heiheihei.txt文件是否存在,不存在就创建

Shell脚本不同于python脚本,中间报错还会继续向下执行

单中括号条件测试

=、!=、!

双中括号条件测试

支持正则        ~

>和>>区别

比较运算符使用场景 区别

逻辑运算符使用场景 区别

总结

开发一个脚本(接收用户输入,根据输入调用不同脚本)

# 打印在屏幕上的提示语

cat <<>

        文本

END

定时 内存检测 发邮件 脚本

1、需求

2、编写脚本

3、配置定时任务执行脚本

4、cron定时任务

5、mail服务安装

date命令格式化

服务监控命令、脚本

服务器本地监控本地服务

netstat命令

ss命令

lsof命令

 ps命令

远程监控远程服务

nmap命令

telnet命令

nc命令

php/python脚本案例(连接mysql)

php脚本

 python脚本

服务启停脚本开发案例-未使用函数

killall命令

alias命令

>和>>

函数

检测网站存活-使用函数开发脚本

服务启停脚本开发案例-使用函数

/etc/init.d/目录下一般存放服务启停管理相关脚本


什么是shell

Shebang 

CentOS支持多种Shell

运行shell脚本的命令

如何运行filename.sh?

/bin/bash filename.sh

bash filename.sh

sh filename.sh

或者

chmod +x filename.sh        # 赋予文件可执行权限

./filename.sh

查看历史命令的相关命令

history        #查看历史命令

history 10        #显示最近10条命令

echo $HISTSIZE        #history命令显示的历史命令条数

echo $HISTFILE        #存放历史命令的文件

history -c        #清除历史命令

history -r        #恢复历史命令

! 3006        #!+历史命令id,执行该历史命令

!!        #执行上条命令,类似上下键寻找命令

创建新用户

几个简单的Shell内置命令

echo

-n 不换行输出

-e 解析字符串中的特殊符号如\n

\n 换行

\r  回车

\t  制表符 四个空格

\b 退格

printf 命令可以识别特殊字符

eval 命令可以执行多个命令

exec 不创建子进程,执行后续命令且执行完毕后自动exit

 

Shell内置命令和外置命令

内置命令:系统启动时就会加载到内存中一直存在,内置命令和shell进程是一体的不会开启子进程执行执行效率高但占资源,如cd命令;

外置命令:系统需要从硬盘中加载程序文件到内存执行效率低,是自己单独下载的文件系统命令,处于bash shell之外的程序,一般存储在/bin、/usr/bin、/sbin、/usr/sbin,外置命令一定会开启子进程执行

通过linux的type命令可以验证某命令是否是内置/外置命令;

查看shell内置命令列表的命令:compgen -b

变量

定义变量、单双反引号和$()的区别

shell中变量全都是字符串类型,定义变量不需要加$符

name="奥利给"        # =号前后不能有空格,双引号可以改为单引号,也可以省略

name1='${name}'        #单引号,不能识别特殊语法

echo $name1

${name}

name2="${name}"        #双引号,可以识别特殊语法

echo $name2

奥利给

nickname=`whoami`        #反引号中的内容被作为命令执行,同$(),结果赋给nickname

 

变量作用域 

pstree 命令用于查看进程树。

局部变量,仅在本地会话中才有效,运行sh命令即进入到新会话假如在两个终端中同时以一个用户名登录(一个用户可以同时在不同的终端多次登陆),此时两个终端分属不同的进程树分支,局部变量互不影响

全局变量即环境变量,针对当前shell及其任意子进程有效,如$PATH。

特殊变量,$?,返回值0表示上条命令执行成功,返回值1-255是错误码。

 

环境变量设置

非root用户登录后所在目录为用户的家目录即/home/{用户名}目录

~对非root用户而言即代表家目录而非根目录

~目录下有用户环境变量配置文件~/.bash_profile和~/.bashrc,用户登录时加载一次

ls /usr/local -a        # 显示/usr/local目录下所有文件

ls ~ -a        # 显示家目录下所有文件

 

只有root用户才有权限编辑全局环境变量配置文件/etc/profile和/etc/bashrc,此文件在登录系统时加载一次

如果全局环境变量配置文件和用户环境变量配置文件都定义了变量name,后者会覆盖前者

远程登录linux服务器如何设置终端失效时间

(即过了多久不操作,终端即将失效)。

方法如下:

[root@mq-console-nameserver ~]# vim /etc/profile

......

export TMOUT=600

[root@mq-console-nameserver ~]# source /etc/profile

如上设置后,登录这台服务器的终端在10分钟内不做操作,则该终端就将失效!

环境变量初始化与加载顺序

如果全局环境变量配置文件和用户环境变量配置文件都定义了变量name,后者会覆盖前者

查看环境变量的命令

set        # 输出所有变量,包括全局的和局部的

set | wc -l        # 统计行数

ls -l /etc | grep "^d" | wc -l        # 统计/etc/下目录的个数。执行ls -l命令后,一个目录显示为一行,所以统计行数即为统计目录数,grep "^d"过滤出目录

set | grep ^name        # ^name表示以name开头的行

declare        # 同set

env        # 只显示全局变量

export        # 显示和设置环境变量值

readonly        # 显示当前系统只读变量

# 使用awk命令输出所有的环境变量名:

删除变量

unset 变量名        # 删除变量或者函数

定义只读变量

exit当前shell,则当前shell的只读变量失效

readonly        # 显示当前系统只读变量

shell特殊‘获取参数’变量 和 for语句

$_       # 获取上次命令的最后一个参数

$@和"$@"一样,加不加引号效果相同,每个参数都是独立的。但是$*被双引号包围时,会将所有参数看作一个整体,下面两段代码的结果是不同的:

$*和$@在没有被双引号包围时,两者没有区别,接受到的每个参数都是独立的,用空格分隔,也就是说下面两段代码是等效的:

[root@localhost code]# cat test.sh
    for var in $@
    do
        echo ${var}
    done
[root@localhost code]#
[root@localhost code]# bash test.sh a b c d
a
b
c
d
[root@localhost code]# chmod a+x test1.sh    # a--all所有用户
[root@localhost code]# cat test1.sh
    for var in $*
    do
        echo ${var}
    done
[root@localhost code]# ./test1.sh a b c d
a
b
c
d

shell特殊‘获取状态’变量

$?        # 获取上条指令执行的结果

$!        # 获取上次后台运行的进程的PID

$$       # 获取当前脚本的PID

$_       # 获取上次命令的最后一个参数

变量子串的用法

name="fanglong"

echo ${#name}        # 8

echo ${name:2}        #  nglong

echo ${name:2:5}        #  nglon n个空格会占n个字符

echo ${name#fang}        #  long

echo ${name#ang}        # fanglong 必须从开头就完全匹配

echo ${name%ong}        # fangl

echo ${name%on}        # fanglong 必须从结尾就完全匹配

name="fangfanglongfang"

echo ${name##fang}        # fanglongfang

echo ${name##fang*long}        # fang

统计变量值长度${#name}

最快的方式

echo ${#name}

wc命令

wc -l        # 统计行数

wc -L        # 统计最长一行的字符个数

expr命令(接收以空格分割的参数)

expr --help        # 查看使用帮助

name="获取你的123"

expr length $name        # 7 统计变量值长度

补充:

算数运算(必须加空格和\)

# 【必须加空格,最好加\否则乘法等会报错】
expr 5 \+ 2    # 7
expr 5 \/ 2    # 2
expr 5 \% 2    # 1

字符运算

expr length 1234567         # 7
expr length 1234567;j就    # 10

逻辑运算(必须加空格和\)

expr 5 \> 7    # 0
expr 5 \< 7    # 1

模式匹配(字符串匹配上了就统计匹配到部分的长度并返回,否则返回0)

                        计算字符串长度

.*                         任意的字符重复任意次

.*\.jpg                 匹配以任意字符开头和结尾,字符串中含有.jpg的字符串

.*\.jpg$               添加$,表示.jpg只能出现在末尾

# 【添加$,表示.jpg只能出现在末尾】
expr yc.jpgggg ":" ".*\.jpg"     # 6
expr yc.jpgggg ":" ".*\.jpg$"    # 0

执行脚本,传入一个文件名,判断文件名后缀是否合法:

在shell中,0为false、1为真

expr 3 \- 1    # 2
expr 1 \- 1    # 0


if expr 3 \- 1                     # 2
    then echo "判断结果为true"     # 判断结果为true
else 
    echo "判断结果为false"
fi


if expr 1 \- 1                     # 0
    then echo "判断结果为true"
else 
    echo "判断结果为false"         # 判断结果为false
fi


if expr 3 \- 4                     # -1
    then echo "判断结果为true"     # 判断结果为true
else 
    echo "判断结果为false"
fi


if 2 
    then echo "判断结果为true"
else 
    echo "判断结果为false"         # 判断结果为false
fi


if expr yc.jpgggg ":" ".*jpg$" >/dev/null      # 这里输入到黑洞中的是0 
    then echo "判断结果为true"
else 
    echo "判断结果为false"         # 判断结果为false
fi


if expr yc.jpgggg ":" ".*jpg" >/dev/null       # 这里输入到黑洞中的是6
    then echo "判断结果为true"     # 判断结果为true 
else 
    echo "判断结果为false"
fi


【总结:
if    命令执行成功返回值为0,    # false
if    命令执行成功返回值不为0即便是负数,    # true
if    某个数字不管是0还是1还是正数,    #false】

找出长度小于5的单词

-lt         less than 小于

-le        小于等于

awk命令

name="获取你的123"

expr $name|awk '{print length($0)}'        # $0 第一行

if语句

【总结:
if    命令执行成功返回值为0,    # false
if    命令执行成功返回值不为0即便是负数,    # true
if    某个数字不管是0还是1还是正数,    #false】

if条件判断参数

-z        判断字符串是否为空,空   -   $?获取的状态码0   -   为true

-n        判断字符串是否非空,空   -   $?获取的状态码非0   -   为false

扩展变量 和 find命令

${parameter:?word}用法:

删除某目录下7天以前的.tar.gz文件:

当前目录及其子目录下所有文件后缀为.txt的文件列出来:

find . -name "*.txt"

BASH多命令一步执行

 分号分割各命令

vim中如何粘贴、设置行号等

在拷贝前输入:set paste (这样的话,vim就不会启动自动缩进,而只是纯拷贝粘贴)

拷贝完成之后,输入:set nopaste (关闭paste)

在命令模式下输入
:set nu
或者
:set number
都可以为vi设置行号,如果要取消的话,则输入
:set nonu
行号的设置是vi的环境设置,不会影响文本的内容。

:25  光标跳转到第25行

快速定位到另一半括号:将光标选中(),[],{},中的任何一半括号上,按下%键(shift+5),便可以看到此时光标已经跳转到另一半的括号上了。

nohup和>/dev/null 2>&1 & 

一、背景说明:

启动服务的时候,如果使用如下命令,则会在start.sh脚本所在的目录下,产生一个名为 nohup.out 的输出文件

nohup ./startup.sh &

这个多余的 nohup.out 文件是不需要的,可以使用如下命令解决:

nohup  ./startup.sh  >/dev/null  2>&1  &

二、命令解析:

1、nohup和尾部 &

  1)nohup 是no hangup,不要挂断,永久运行。关闭终端,当前运行的进程不终止,标准输出内容会输出到当前目录的 nohup.out 日志文件中而不显示在终端

  2)命令最后一个 &,表示后台运行的意思,和 nohup 一起配置表示不挂断后台运行

2、>/dev/null 和 2>&1

  1)/dev/null 是 Linux 一个空设备文件,通常也被称为位桶(bit bucket)或黑洞,这个文件接收到任何数据都会被丢弃,也就是不输出任何信息到终端。

  2)> 代表重定向到哪里;重定向的符号有两个:> 或 >>,> 会先清空文件,然后再写入内容,>> 会将重定向的内容追加到现有文件的尾部。

  3)Linux系统预留了三个文件描述符:0、1 和 2,他们的意义如下所示:

    ①0:标准输入流 stdin

    ②1:标准输出流 stdout,默认值是1

    ③2:标准错误流 stderr

  4)">/dev/null" 等价于 "1>/dev/null",表示标准输出(1)输出到 /dev/null 中,即终端不输出标准输出信息;

     "2>&1" 中的 “&” 是等价于的意思,表示标准错误(2)输出的位置等价于标准输出(1)的位置,即等价于 “2>/dev/null”, 即终端不输出标准错误信息。

             因此,">/dev/null 2>&1" 表示 标准错误信息和标准输出信息,在终端上均不输出。

三、指定输出文件:

如果想要将服务启动和运行过程中的日志信息输出到指定位置(比如:/var/log/start.log),可以参考如下命令:

nohup ./startup.sh >/var/log/start.log 2>&1 &
或
nohup sh startup.sh >/var/log/start.log 2>&1 &

四、sh xxx.sh与./xxx.sh区别:

sh xxx.sh是用sh执行startup.sh,startup.sh可以没有执行标志,可以不用加./,可以不用在脚本第一行写上#! /bin/sh。
./startup.sh是调用脚本第一行指定的shell去解释执行,缺省为sh,就是bash,需要chmod +x startup.sh赋予可执行权限。

五、补充

for n in {1..10}

do

        char=`seq -s "chaoge" 10`

        echo ${#char} 1>/dev/null     # 1>/dev/null同&>/dev/null同>/dev/null,echo不会打印

        1>/dev/null        # 须写在一行,分行写无效

done

for循环

seq命令-生成序列

seq -s ":" 10        # 指定分隔符

time命令-统计命令执行时长

time for n in {1..10}

do

char=`seq -s "chaoge" 10`

echo ${#char} >/dev/null

done

time for n in {1..10};do char=`seq -s "chaoge" 10`;echo ${#char} >/dev/null;done

mv命令

将/usr/udt中的所有文件移到当前目录(用”.”表示)中:

mv /usr/udt/* .

把当前目录里的文件移动到另一个目录里

mv  当前目录/*  另一个目录

移动当前文件夹下的所有文件到上一级目录../表示

mv * ../

批量创建文件&批量修改文件名

批量创建文件:

 修改当前目录下所有jpg文件的文件名,去掉_finished字符

父子shell

pstree可以查看进程树,ps -ef --forest也可以查看进程树:

exit命令可以退出子shell。

使用子shell可以做什么?

 

测试:

使用小括号是开启了子shell运行,$BASH_SUBSHELL返回1

不使用小括号是在当前shell运行,$BASH_SUBSHELL返回0

多个小括号嵌套时会嵌套shell执行,$BASH_SUBSHELL值会累加

数学运算脚本开发 

数学运算基础学习-双小括号$(( ))计算等

逻辑运算,真为1假为0:

shell的一些基础命令只支持整数运算,小数运算则需要像bc这样的命令才支持:

面试题:


通过$1特殊参数变量把计算表达式作为脚本的参数传递到脚本中进行计算:

sed命令-字符串替换

name="qwe123"
# echo不能去掉,s代表替换支持正则,[0-9]正则,替换成m,g表示全部替换不止第一个
res="`echo $name|sed 's/[0-9]/m/g'`"
echo $res    # qwemmm
# 只替换第一个数字,最后一个/不能去掉
res="`echo $name|sed 's/[0-9]/m/'`"
echo $res    # qwem23
# 把数字去掉
res="`echo $name|sed 's/[0-9]//g'`"
echo $res    # qwe

开发一个接收用户输入数值并计算的脚本,判断输入是否合法:

Let运算命令

let命令效果等同于双小括号,但是效率相对较慢

num=8
num=num+8
echo $num    # num+8

unset num

num=8
let num=num+8
echo $num    # 16

unset num

num=8
echo $((num = num + 8))    # 16

 $[]计算

num=5;
echo $[num*4]           # 20
echo $[num+4*-1*num]    # -15

#中括号方式不支持小数运算
# num1=5.1
# echo $[num1+4]    # syntax error: invalid arithmetic operator (error token is ".1")

awk命令(支持小数计算)

bc命令(支持小数计算)

敲bc回车即可进行交互式计算

数值与运算符之间加不加空格都可以

管道符 + bc        非交互式的小数计算,可以在脚本中做小数计算并赋值

计算1~100的和

第一步,先生成字符串计算公式:

echo {1..100} | tr " " "+"

seq -s "+" 100

第二步,双括号计算/bc计算/expr计算

xargs是linux中构造参数的命令

echo $((`seq -s "+" 100`))
echo $((`echo {1..100} | tr " " "+"`))

echo {1..100} | tr " " "+" | bc
seq -s "+" 100| bc

# expr接收的参数需要空格分割,所以+前后须有空格
seq -s " + " 100| xargs expr

tr命令(替换字符、删除字符等)

把空格替换为+

echo {1..10}                 # 1 2 3 4 5 6 7 8 9 10
echo {1..10} | tr " " "+"    # 1+2+3+4+5+6+7+8+9+10

删除字符串中的指定字符

echo {1..10} | tr -d " "            # 12345678910
echo {1..10} | tr -d "2"                # 1  3 4 5 6 7 8 9 10
# "158"中的1、5、8处理为单个字符
echo "112345678910" | tr -d "158"    # 2346790

网址服务状态监测脚本

read命令

(-t  等待用户输入超时,秒)

(-p 指定接收用户输入的参数,可以多个参数)

条件测试

test命令条件测试

选项参数

-e        判断文件或者目录是否存在,存在则命令执行返回状态码为0,否则不为0

-f         判断是否为文件/文件是否存在

-d        判断是否为目录/目录是否存在

-b        判断文件是否作为block device块设备

-c        判断文件是否作为character device设备

-S        判断文件是否作为Socket文件

-p        判断文件是否作为FIFO(pipe)文件

-L        判断文件是否作为连接档

-r         判断文件是否可读

-w        判断文件是否可写

-x         判断文件是否可执行

-u         判断文件是否具有SUID属性

-g         判断文件是否具有SGID属性

-k         判断文件是否具有sticky bit属性

-s         判断文件是否为非空白文件

-z         判断字符串是否为空,空   -   $?获取的状态码0   -   为true

-n         判断字符串是否非空,空   -   $?获取的状态码非0   -   为false

-a、-o、!

-nt、-ot、-ef

inode即索引节点,用来存放文件或目录的基本信息,包含时间、链接数、群组等。

硬连接和软链接

"硬链接"(hard link)一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件;但是,删除一个文件,不影响另一个文件的访问。ln命令可以创建硬链接:

ln 源文件 目标文件

"软链接"(soft link)除了硬链接以外,还有一种特殊情况。文件A和文件B的inode号码虽然不一样,但是文件A指向文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:"No such file or directory"。这是软链接与硬链接最大的不同:文件A指向文件B的路径,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。ln -s命令可以创建软链接:

ln -s 源文件或目录 目标文件或目录

inode是什么_foxkingwuyuan的博客-CSDN博客_inode

条件1  &&  条件1成立要执行的操作  ||  条件1不成立要执行的操作

通过test命令判断heiheihei.txt文件是否存在,不存在就创建

Shell脚本不同于python脚本,中间报错还会继续向下执行

使用shell编写创建hello目录的脚本

所以需要加条件判断,只需要将脚本中的mkdir hello命令替换成下面的命令即可

单中括号条件测试

test和[]作用一样,中括号前后需要有空格,

在单中括号中也可以使用 > 等比较运算符,但需要加转义符。

在单中括号中,只能使用-a、-o、!逻辑运算符,不能使用&&等。

使用变量必须用双引号包裹如"$name"

=、!=、!

双中括号条件测试

[[ 条件表达式 ]]    前后必须有空格,和单中括号区别:使用>等不需要转义;支持正则

ll命令可以查看文件权限,

chmod 0 文件名  取消文件权限

chmod +r 文件名  授予可读权限        

chmod +w 文件名  授予可写权限

支持正则        ~

>和>>区别

>        会覆盖目标的原有内容,当文件存在时,会先删除原文件,再重新创建文件,然后把内容写入该文件,否则直接创建文件。 

>>      会在目标原有内容后追加内容,当文件存在时直接在文件末尾进行内容追加,不会删除原文件,否则直接创建文件。

比较运算符使用场景 区别

test命令也可以使用 > 等比较运算符。

在单中括号中也可以使用 > 等比较运算符,但需要加转义符。

在双中括号也可以使用-eq等。

在单中括号中也可以使用 > 等比较运算符,但需要加转义符,否则运算错误:

 

逻辑运算符使用场景 区别

 在单中括号中,只能使用-a等逻辑运算符,不能使用&&等。

总结

在单中括号中也可以使用 > 等比较运算符,但需要加转义符。

在单中括号中,只能使用-a、-o、!逻辑运算符,不能使用&&等。

使用变量必须用双引号包裹如"$name"

test命令也可以使用 > 等比较运算符

开发一个脚本(接收用户输入,根据输入调用不同脚本)

在/shell_program/test_scripts目录下模拟两个将被调用的脚本:

开发脚本:

# 被调用脚本所在目录

# 判断目录是否存在,不存在就创建

# 打印在屏幕上的提示语

cat <<END

        文本

END

# 限制只能输入数字

# 如果输入1

# 如果输入2

省略。。。

# 如果输入3 退出脚本

省略。。。 

# 限制只能输入1,2,3

定时 内存检测 发邮件 脚本

1、需求

定时执行脚本检测内存,当内存小于某值,使用linux发邮件给运维

tee是Linux命令,用于显示程序的输出并将其复制到一个文件中,-a追加

2、编写脚本

在/shell_program/scripts/下编写脚本,由于没有安装mail服务故注释掉对应行

3、配置定时任务执行脚本

 回车,编辑如下内容保存退出(退出即启动):

  回车,显示当前运行的定时任务

如果任务未按照你的预期运行,可以通过 systemctl status cron.service 查看守护进程是否 running,使用journalctl -u cron.service 可以查看更多的日志信息。

4、cron定时任务

crond定时任务表达式的格式不同于java的cron表达式没有秒

 */3    *      *      *      *     每3分钟执行1次

检测系统是否安装crond服务

  • service crond status
  • 所有的定时任务都是由 cron 守护进程来负责调度执行的,如果任务未按照你的预期运行,可以通过 systemctl status cron.service 查看守护进程是否 running,使用journalctl -u cron.service 可以查看更多的日志信息。

安装

  • yum -y install vixie-cron
  • yum -y install crontabs

cron服务是linux的内置服务,但它不会开机自动启动。可以用以下命令启动和停止服务:

/sbin/service crond start  
/sbin/service crond stop  
/sbin/service crond restart  
/sbin/service crond reload  

要把cron设为开机启动

  • 在/etc/rc.d/rc.local脚本中加入/sbin/service crond start即可。

设置开机自动启动

  • chkconfig --level 345 crond on

linux系统是一个多用户系统,crontab也支持多用户,每个用户都可以有自己的crontab(在 /var/spool/cron/crontabs下),比如sudo crontab -u root -e便可编辑 root 用户的配置。除此之外,/etc/cron.allow 文件控制哪些用户可以使用 crontab,/etc/cron.deny 文件控制哪些用户不可以使用 crontab。

系统级的crontab:/etc/crontab 文件中设置的是一些系统级的定时任务,其中每行都多了一个执行用户,并且是直接编辑该文件而不是使用 crontab 命令来管理。

  • file   使用file文件作为某个用户的cron服务配置,内容会复制到cron服务此用户的配置文件中,可省略此参数
  • crontab -u   指定某个用户的cron服务配置,这个前提是你必须要有其权限(比如说是 root)才能够指定他人的时程表,一般 root 用户在执行这个命令的时候需要此参数。如果不使用 -u user 的话,就是表示设定自己的时程表。
  • crontab -l  查看当前运行的定时任务
  • crontab -r  删除所有的定时任务
  • crontab -e  回车打开文件编辑定时任务保存退出
  • 停止某个定时任务,只需要 -e 的时候使用 # 将其注释即可

crontab默认编辑器为nano,设置crontab的默认编辑器

1、永久性设置:在 /etc/profile、/etc/bashrc 文件,$HOME/.bashrc文件或者$HOME/.bash_profile文件里面添加export EDITOR=vim
echo export EDITOR=vim >>$HOME/.bashrc
2、临时设置:
export EDITOR=”/usr/bin/vim” ; crontab -e

3、更简单的办法,直接执行命令:select-editor,然后选择3(不是所有发行版都有这个命令)

root@ubuntu:~# select-editor

Select an editor. To change later, run ‘select-editor’.
1. /bin/ed
2. /bin/nano <—- easiest
3. /usr/bin/vim.basic
4. /usr/bin/vim.tiny

Choose 1-4 [2]: 3

5、mail服务安装

Linux搭建邮件服务器 - 总要做些什么 - 博客园

date命令格式化

date +%F\ %T    # 2022-10-21 15:31:47
date +%F%T      # 2022-10-2115:31:31
date +%F-%T     # 2022-10-21-15:31:09
其他格式略,参考:
https://blog.csdn.net/drcwr/article/details/50971637

服务监控命令、脚本

服务器本地监控本地服务

netstat命令

netstat -tunlp | grep 3306 | wc -l        # 查看端口为3306的进程

netstat -tunlp | grep mysql | wc -l        # 查看服务名为mysql的进程

ss命令

ss -tunlp | grep mysql | wc -l

lsof命令

lsof -i:3380 | wc -l

lsof -i tcp:3380 | wc -l

ps命令加grep -v grep

远程监控远程服务

yum -y install telnet nmap nc 

nmap命令

nmap 远程服务器ip -p 3380

telnet命令

telnet ip port

nc命令

nc命令在linux系统中实际命令是ncat,nc是软连接到ncat。

-l        用于指定nc将处于侦听模式。指定该参数,则意味着nc被当作server,侦听并接受连接,而非向其它地址发起连接

-s       指定发送数据的源IP地址,适用于多网卡机

-u       指定nc使用UDP协议,默认为TCP

-v       输出交互或出错信息,新手调试时尤为有用

-w      超时秒数,后面跟数字 

-z       表示zero,表示扫描时不发送任何数据

-n       直接使用IP地址,而不通过域名服务器

-r        乱数指定本地与远端主机的通信端口

  • 如下验证172.16.7.78服务器的80端口通,81端口不通:

  • 端口扫描,通的端口返回succeeded,不通的端口返回refused

nc -zv -w 2 172.16.7.78  22-81

  • 文件传输

首先在文件接收终端test2机器上激活nc监听,开放端口33333,保存为tc.txt
在这里插入图片描述

然后在文件发送终端test1机器上发送文件,指定目标ip port,要传输的文件
在这里插入图片描述
在test2上检查文件是否已成功接收

在这里插入图片描述

  • 通信聊天

test1主机上启动nc监听,ctrl+C中断通信。

在这里插入图片描述

test2上连接监听,ctrl+C中断通信。
在这里插入图片描述

php/python脚本案例(连接mysql)

php脚本

在脚本中调用外部脚本:

python脚本

服务启停脚本开发案例-未使用函数

killall命令

killall [选项]  name

  • name : 进程名
选项包含如下几个参数:
  • -e | --exact : 进程需要和名字完全相符
  • -I | --ignore-case :忽略大小写
  • -g | --process-group :结束进程组
  • -i | --interactive :结束之前询问
  • -l | --list :列出所有的信号名称
  • -q | --quite :进程没有结束时,不输出任何信息
  • -r | --regexp :将进程名模式解释为扩展的正则表达式。
  • -s | --signal :发送指定信号
  • -u | --user :结束指定用户的进程
  • -v | --verbose :显示详细执行过程
  • -w | --wait :等待所有的进程都结束
  • -V |--version :显示版本信息
  • --help :显示帮助信息

alias命令

alias        #列出已存在的别名

alias catname="cat /usr/local/springboot/spring.config"        # 创建别名,使命令更易用

执行catname命令,等同执行cat /usr/local/springboot/spring.config

>和>>

>是覆盖

>>是追加

函数

return [ n ]
其中,n是退出函数时的退出值(退出状态),
即$?的值。当n值默认时,则退出值是最后一个命令执行后的退出值!

function关键字和()可以省略,

参数不能写在括号中,当n>=10时,需要使用${n}来获取参数,

$*不加引号=$@不加引号:

function sayHello() {
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}

第一种方式,函数定义和函数调用在同一文件中,略。

第二种方式,函数定义在单独文件中,在外部调用函数

set是显示当前shell的全局变量和局部变量,执行此命令会发现没有环境变量chao

输入函数名回车就可以执行此函数,相当于一个命令了

检测网站存活-使用函数开发脚本

wget命令

-q, –-quiet 安静模式(没有输出)
-o, –-output-file=FILE 把记录写到FILE文件中
-a, –-append-output=FILE 把记录追加到FILE文件中

--spider 不下载任何东西

-t, –-tries=NUMBER 设定最大尝试链接次数(0 表示无限制)

-T, –-timeout=SECONDS 设定响应超时的秒数
-w, –-wait=SECONDS 两次尝试之间间隔SECONDS秒

不用函数时:

改造为使用函数:

执行使用函数的脚本,可以看到美化的“确定“和”失败”:

服务启停脚本开发案例-使用函数

/etc/init.d/目录下一般存放服务启停管理相关脚本


完结撒花!!!!!!!!!勇毅前行、踔厉奋发

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值