shell script 3

passwd root 修改密码

history -c  清除历史命令

shell  filename.sh 命令解析器执行脚本。修改文件权限 和路径之后可以直接执行脚本文件名字

chmod +x 

sleep numoftime  睡眠一段时间

ifconfig eth0 获取网卡的信息

history   # !+编号 可以执行相关命令

service ** start / restart/stop #管理相关的服务

##命令别名

df -th #观察硬盘情况

alias yourname=dr -th#添加别名

unalias yourname# 取消别名

alias #查看所有的别名

#永远有效 编辑.bashrc 加上alias 相关命令就可以永久有效了

##输出重定向

#< 输入 >输出

#0 标准输入;1标准输出 ; 2 错误输出

ls 1> myfile.log 2>&1 #将错误输出和标准输出都重定向到 myfile.log 不要更改顺序, 因为文件打开有先后

&> filename #将标准输出和错误输出全部重定向到文件中filename

#管道操作符

free -m #获取硬盘容量

free -m | grep -i mem #-i忽略大小写 将上一个消息的输出 利用管道输入到下一条命令中

free -m | grep -i mem | awk  '{print  $1 "\n" $2"\n" $4 "\n"}'# 并且拿出第四个变量

 

##认识权限和用户管理

#查看文件属性

ls -l file 

#权限类型

rwx

文件类型   ---    ---   ---    文件所有者  文件所属组  大小  时间  名字

目录/文件 用户 组  其他 

#永固管理

#用户添加

useradd  #添加用户

userdel -r  username #删除用户 慎用, 会把所有的内容都删除, home下的相关文件

#查看用户

id root #id  加上疑问名字,可以查看用户id 组 id

#!!表示该用户没有密码

passwd username # 给用户设置密码

cat  /etc/shadow #存放密码

#修改用户的组 

gpasswd -a userid groupname#把用户加入组

gpasswd  -d  userid groupname #把组内用户删除

#权限分配

chmod  :775  // u g o (a)+、-rwx 两种方式 给文件修改权限 可以修改用户 组 其他 

#为了修改其他单个用户,组不同的权限使用acl,可以把所有需要权限的用户 加到一个组里。gpasswd -a userid groupname

 

acl#权限细化

setfacl   -m  u:username:rwx  filename #设置文件权限 不能删除操作 删除需要对目录具有权限

getfacl filename#查看文件权限

setfacl -x u:username:rwx filename  #删除权限

setfacl -b filename #删除所有设置acl的权限 #清空文件权限

#修改目录 权限 才可以创建和修改文件

setfacl -m u:user:rwx \direction

#如何设置目录及目录下的所有文件设置权限

setfacl -m u:userid:rwx -R /mnt/ #-R递归的意思

#后期添加目录文件的权限继承

setfacl -m d:u:userid:rwx -R /mnt/  #default 

#应用程序

#当发现以下命令自己没有权限执行时, 使用能够sudo,输入密码获取超级用户权限

编辑 sudo 添加如下 

user  localhost=/usr/bin/useradd #需要这个用户可以执行的命令

user ALL/localhost=NOPASSWD:/usr/bin/passwd #不需要秘密的 分配sudo权限

然后sudo +命令 + 输入密码。user就可以执行该命令

脚本执行和编写

shell 脚本:保存完成特定任务的多条linux命令的可执行文本

#!/bin/sh 命令解析器

 #

命令

修改文件可执行权限

执行方式:

1.bash filename #不需要写解释器,不需要修改文件可执行权限

2../filename #需要给脚本设置执行权限,需要写解释器

3. filename #直接作为一个命令,需要添加目录作为环境变量

 

#!/bin/bash 
#test 

echo 'disk space'
echo
df -Th
echo
echo 'free space'
free -m
echo
echo 'users:'
for i in 'ls /home'
do 
    id -u $i
done


每周五执行的管理脚本,FTP目录统计

 

#!/bin/sh

#

date >> /var/log/pubdir.log
ls -lhR /var/ftp/pub >> /var/log/pubdir.log
rm -rf /var/ftp/pub/*

每周五执行

//crond 是linux下用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务 工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。

在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。

crontab -e 

minute hour day month week command

其中:

minute: 表示分钟,可以是从0到59之间的任何整数。

hour:表示小时,可以是从0到23之间的任何整数。

day:表示日期,可以是从1到31之间的任何整数。

month:表示月份,可以是从1到12之间的任何整数。

week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。

command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

脚本就会定时执行

shell变量类型和运算符

变量的定义和使用

https://blog.csdn.net/u012516571/article/details/88698952 

单引号不能解析变量,所有都是普通字符串

反引号:执行命令,输出命令返回值

位置变量、预定义变量和运算符

https://blog.csdn.net/u012516571/article/details/88698952 

位置变量:

只有9个。

$n

预定义变量是位置变量的一个补充

#!/bin/bash

sum=0
for i in $*;
do
 sum = $(($sum+$i))
 sleep 1 
done
echo $sum
if[[$? == 0]];then
 echo "上一条命令执行成功"
else
 echo "上一条命令执行错误"
fi

echo "当前脚本名字$0"
echo "当前脚本参数$#个"
echo "当前脚本参数是:$*"

数值变量运算

expr 变量1 运算符 变量2 

支持的运算:+ - * / %

expr 4 + 2  #  $((4+2))

 

shell输入、输出功能

shell 输入、输出功能和字符颜色设置

echo

 -e 打开转义。若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:
           \a 发出警告声;
           \b 删除前一个字符;
           \c 最后不加上换行符号;
           \f 换行但光标仍旧停留在原来的位置;
           \n 换行且光标移至行首;
           \r 光标移至行首,但不换行;
           \t 插入tab;
           \v 与\f相同;
           \\ 插入\字符;
           \nnn 插入nnn(八进制)所代表的ASCII字符;
    -E 取消转义 (默认)
    -help 显示帮助
    -version 显示版本信息

echo输出颜色文本
格式: echo -e "\033[xx;xx;...;xxm" 
其中:-e  开启转义
           \033[  八进制033即退出键<ESC>的ASCII码,表示设置文本颜色
           xx;...;xx  xx是选择编码,不同的数值代表设置不同项,下面会介绍编码。编码的顺序没要求(网上好多的介绍的有误,认为背景颜色在前,文字颜色在后)。
           m  表示设置结束

一般的用法是:   echo -e "\033[背景颜色;文字颜色m字符串\033[0m"
意思是:用设置的背景颜色和文字颜色打印字符串,然后再把背景色和文字颜色恢复默认设置,0表示使用默认设置。
 

echo  "\033[44;37m [task]\033[0m"

cat #标记输出  cat<<a  sdfsdgsdgwetwetwerwewrea  a  #原样输出

tee #输出一份保存一份到一个文件中

more  #只显示满屏,

head #头十行

tail #尾十行

nl #表示行号

shell的条件测试和流程控制

文件测试和整型测试

文件测试

测试文件状态 0 为真

d 是否是目录

e 目录或文件是否村子

f 是否是文件

r 当前用户是否可读

w 当前用户是否可写

x 当前用户是否可执行

L 是否为连接符文件

#!/bin/bash

#file test 

if [ -d  ./etc ] then
    echo "exist"
else
    echo "no"
    touch /etc
fi
echo $?

整型测试

https://blog.csdn.net/u012516571/article/details/88698952 

#!/bin/bash

age=30

if [ $age -lt 30 ]
then 
    echo "-lt 30"
elif [ $age -eq 29 ]
then
    echo "-eq 29 "
elif [ $age -lt 29 ] 
then
    echo " -lt 29"
elif [ $age -ge 30 ] 
then
    echo "-ge 30"
fi

 

字符串测试和逻辑测试

字符串测试

=:字符串内容相同

!=:字符串内容不同

-z:字符串不为空

#!/bin/bash

read -p "name:" nmae 
read -p "pass:" pass

if [ $name = 'admin'] && [ $pass  ='123' ]
then 
    echo "log in"
else
    echo "log in failiur"
fi

逻辑测试

-a 或者 &&:与  前面为0后面不执行 

-o 或者||:或 前面为1后面不执行

!:非

放在表达式之间 [] 操作符 [] 操作符 []

 

流程判断

if 分支判断

#!/bin/bash

age=24

if [ $age -lt 18 ]
then
    echo "未成年"
else
    echo "已成年"
fi

#60-70-80-90
score=87 

if [ $score -lt 60 ]
then
    echo " -lt 60 "
elif [ $score -ge 60 ] && [ $score -lt 70 ];then #练习用
    echo " 60 -70"
elif [ $score -ge 70 ] && [ $score -lt 80 ];then
    echo " 70 - 80"
elif [ $score -ge 80 ] && [ $score -lt 90 ];then
    echo " 80 - 90"
else 
    echo "90"
fi

case

#!/bin/bash

#case

week=$(date +%w)

case $week in
1)
    echo "monday"
;;
2)
    echo "tuseday"
;;
3)
    echo "wenseday"
;;
4)
    echo "thurseday"
;;
5)
    echo "friday"
;;
6)
    echo "saturday"
;;
7)
    echo "sunday"
;;
*)
    echo "others"
esac
#!/bin/bash

#case

week=$(date +%w)

case $week in
[1-5])
    echo "work day"
;;
[6-7])
    echo "holiday"
;;
*)
    echo "others"
esac

循环控制

for

#! /bin/bash
#for


for i in $(seq 1 9)
do
    echo "$i"
done

for i in user0 user1 user2 user3
do
    echo "$i"
    userdel -r $i
done


for i in ${cat user.txt} #`cat user.txt`
do
    echo "$i"
    useradd $i
    echo 123|passwd --stdin $i
done


for i in ${cat /etc/passwd|awk -F: 'print $1'}
do
    echo $i
    echo $i >> user.txt
done


for ((i=0;i<10;i++))
do 
    echo "$i"
done

while

#! /bin/bash

#while


sum=3
total=0

while [ $sum -ge 0 ]
do 
    total=$(($total+$sum))
    sum=$(($sum-1))
done
echo "$total"

grep  "/bin/bash" /etc/passwd | cut -d ":" -f 1 

cat /etc/passwd | gawk -F: '{print $1}'

循环把控和函数使用

循环把控

#! /bin/bash

#for
for((i=0;i<10;i++))
do
    
    sleep 1
    if [ $i -eq 5 ];then
        break
    elif [ $i -eq 4 ];then
        echo "it's 4"
		continue
    fi
    echo $i
done

shift :从左边开始删除一个参数,参数左移,每次都可以选择$1 就可以了

函数使用

#!/bin/bash

function add(){
    echo "this is a function"
    num=$1
    total=0
    for((i=1;i<$num;i++))
    do
       total=$(($total+$i))
    done
    echo $total
}

add 1
add 10
add 100

 

shell文本操作

find

find   path   -option   [   -print ]   [ -exec   -ok   command ]   {} \;

参数说明 :

find 根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部份为 path,之后的是 expression。如果 path 是空字串则使用目前路径,如果 expression 是空字串则使用 -print 为预设 expression。

expression 中可使用的选项有二三十个之多,在此只介绍最常用的部份。

-mount, -xdev : 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件

-amin n : 在过去 n 分钟内被读取过

-anewer file : 比文件 file 更晚被读取过的文件

-atime n : 在过去n天内被读取过的文件

-cmin n : 在过去 n 分钟内被修改过

-cnewer file :比文件 file 更新的文件

-ctime n : 在过去n天内被修改过的文件

-empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name

-ipath p, -path p : 路径名称符合 p 的文件,ipath 会忽略大小写

-name name, -iname name : 文件名称符合 name 的文件。iname 会忽略大小写

-size n : 文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。-type c : 文件类型是 c 的文件。

d: 目录

c: 字型装置文件

b: 区块装置文件

p: 具名贮列

f: 一般文件

l: 符号连结

s: socket

-pid n : process id 是 n 的文件

你可以使用 ( ) 将运算式分隔,并使用下列运算。

exp1 -and exp2

! expr

-not expr

exp1 -or exp2

exp1, exp2

将目前目录及其子目录下所有延伸档名是 c 的文件列出来。

# find . -name "*.c"

将目前目录其其下子目录中所有一般文件列出

# find . -type f

将目前目录及其子目录下所有最近 20 天内更新过的文件列出

# find . -ctime -20

查找/var/log目录中更改时间在7日以前的普通文件,并在删除之前询问它们:

# find /var/log -type f -mtime +7 -ok rm {} \;

查找前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件:

# find . -type f -perm 644 -exec ls -l {} \;

为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径:

# find / -type f -size 0 -exec ls -l {} \;

例子

find. -nmae "[a-z]*"
#查找字母开头的文件
find . -perm 777
#查找777 权限的文件
find . -user root
#查找属于root的文件
find . -perm 777 -type f -name filename
查找可执行的filename文件
find . -mtime +5//-3
时间前/内更改的文件
find . -size  +1000000c
大小大于多少的文件
fine . -nmae "*user" | xargs rm -rf 
找到并删除,传递参数 首先在命令行中查找要处理的内容的来源,如果在命令行中找不到与要处理的内容的来源相关的参数则默认从标准输入中读取要处理的内容了。


Linux正则表达式详解

grep -c "file" a 

在文件中有多少行匹配到a

grep -n “file” a

在a文件中有多少行匹配到,同时显示行和行号

grep -i "file“ a

在a文件中查找file,并不区分大小写

grep -v "file" a

在a文件中过滤掉file所在的行

grep -E "2004:22:5[0-9]" a  #-E就是使用正则表达式的意思

在a 文件中查找2004:22:5[0-9]所在的行

grep -E "[5-8][6-9][0-3]" a

查找大于560 小于893的行

grep -E  "^linux"  filename

查找 Linux开头的行

grep -E  "linux$"  filename

查找 Linux结尾的行

grep -E  ".*"  filename

匹配任意多个字符.任意字符, *任意多个

grep -E  ".*linux.*" filename#包含开头和结尾

grep -E  ".+inux.+" filename #没有开头和结尾

.任意一个字符 +多个字符不存在0个    *任意多个

[0-9]任意一个0-9之间的数

(linux)+匹配多次Linux #()这是一个单元

(web){2}至少连续两个web #{}匹配几次

(web){2.4}$ 以2-4个web 结尾

\屏蔽元字符的含义,用于查询* + $

-v 去反

grep -En  "^$" filename

开头和结尾都是空,就是查找空行

grep -En  "^.$" filename

只含有一个字符的行

grep -En "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+ #[0-9] 等价于 /d

grep -En "[0-9]{3}+\.[0-9]+\.[0-9]+\.[0-9]" temp

grep -En "/d{3}+\.[0-9]+\.[0-9]+\.[0-9]" temp

grep -Pn "\d{1,3}" temp 匹配一直三个数字。

-P -E 和  不加  使用不同的正则表达式, 基本的 扩展的 Perl的

匹配带有IP的的行,\屏蔽元字符的含义

grep -En "\*" filename

查找含有* 的行

整理一个元字符

\ 取消元字符作用

^开头匹配 中括号里取反的意思

$结尾匹配

*匹配0次或多次

+匹配至少一次

?匹配0次或1次

{n} 匹配n次

{n,m}匹配n-m次

x|y 匹配x或者y

[xyz]匹配xyz中的任意一个

[^a-z]集合意外的匹配任意一个

\W

[a-z]匹配a-z的任意一个

\w 等价上一

[0-9]

\d

[^0-9]

\D

aaaa\b 匹配 aaaa结尾的单词

\B 与上取反

\t 制表符

\r 回车符

\v 垂直制表符

\n 换行符

\f 换页符

\xn 匹配16进制n 的ASC字符  #\x41  A
 

AWK专辑

 

cat temp |awk -F: '{print $1 "=" $2}' filename #以:号作为分隔符拿出第一列并加上一些字符 拿出第二列

-F 分割符。默认为空格 可以省略

cat temp |awk -F: '{if(NR==3){print $0}}'  打印第三行的 整行

df |awk  '{if(NR==3){print $1 }}'

df |awk  'END{print NR “ ”NF}' 打印总共有多少行数据 多少列

 df |awk  '{print $1 "\t" $2}' 打印第一列和第二列

cat file | awk '$0 !~/string/’  #$0每一列 拥有string

cat temp| awk '$1~/192.123.345.56/{print $0}' 打印拥有192.123.345.56的每一列

sed工具

Linux sed命令是利用script来处理文本文件。

sed可依照script的指令,来处理、编辑文本文件。

Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

sed [-hnV][-e<script>][-f<script文件>][文本文件]

参数说明

  • -e<script>或--expression=<script> 以选项中指定的script来处理输入的文本文件。
  • -f<script文件>或--file=<script文件> 以选项中指定的script文件来处理输入的文本文件。
  • -h或--help 显示帮助。
  • -n或--quiet或--silent 仅显示script处理后的结果。
  • -V或--version 显示版本信息。
  • 动作说明

  • a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
  • i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
  • s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

实例

$ sed -e 4a\newline testfile #使用sed 在第四行后添加新字符串 
[root@www ~]# nl /etc/passwd | sed '2,5d'
#sed 的动作为 '2,5d' ,那个 d 就是删除!因为 2-5 行给他删除了,所以显示的数据就没有 2-5 行罗~ 
#另外,注意一下,原本应该是要下达 sed -e 才对,没有 -e 也行啦!同时也要注意的是, sed 后面接的动
#作,请务必以 '' 两个单引号括住喔! 
[root@www ~]# nl /etc/passwd | sed '2a drink tea'
#在第二行后(亦即是加在第三行)加上『drink tea?』字样!
nl /etc/passwd | sed '2i drink tea'  #那如果是要在第二行前
[root@www ~]# nl /etc/passwd | sed '2,5c No 2-5 number' #将第2-5行的内容取代成为『No 2-5 number』呢?
[root@www ~]# nl /etc/passwd | sed -n '5,7p' #可以透过这个 sed 的以行为单位的显示功能, 就能够将某一个文件内的某些行号选择出来显示。 
nl /etc/passwd | sed  '/root/d' #删除/etc/passwd所有包含root的行,其他行输出
nl /etc/passwd | sed -n '/root/{s/bash/blueshell/;p;q}' #搜索/etc/passwd,找到root对应的行,执行后面花括号中的一组命令,每个命令之间用分号分隔,这里把bash替换为blueshell,再输出这行:q退出
[root@www ~]# /sbin/ifconfig eth0 | grep 'inet addr' | sed 's/^.*addr://g' #sed 's/要被取代的字串/新的字串/g'
nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/' #删除/etc/passwd第三行到末尾的数据,并把bash替换为blueshell
sed -i '$a # This is a test' regular_express.txt#sed 的 -i 选项可以直接修改文件内容,这功能非常有帮助!$表示最后一行

nl 可以将输出的文件内容自动的加上行号!其默认的结果与 cat -n 有点不太一样, nl 可以将行号做比较多的显示设计,包括位数与是否自动补齐 0 等等的功能。  

sort排序

Linux sort命令用于将文本文件内容加以排序。

sort可针对文本文件的内容,以行为单位来排序。

sort [-bcdfimMnr][-o<输出文件>][-t<分隔字符>][+<起始栏位>-<结束栏位>][--help][--verison][文件]

参数说明

  • -b 忽略每行前面开始出的空格字符。
  • -c 检查文件是否已经按照顺序排序。
  • -d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。
  • -f 排序时,将小写字母视为大写字母。
  • -i 排序时,除了040至176之间的ASCII字符外,忽略其他的字符。
  • -m 将几个排序好的文件进行合并。
  • -M 将前面3个字母依照月份的缩写进行排序。
  • -n 依照数值的大小排序。
  • -o<输出文件> 将排序后的结果存入指定的文件。
  • -r 以相反的顺序来排序。
  • -t<分隔字符> 指定排序时所用的栏位分隔字符。
  • +<起始栏位>-<结束栏位> 以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
  • --help 显示帮助。
  • --version 显示版本信息。

实例

sort -k1 #根据第一列来排序 ,分列 默认为空格为分隔符

 

 

uniq统计

Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用。

uniq 可检查文本文件中重复出现的行列。

uniq [-cdu][-f<栏位>][-s<字符位置>][-w<字符位置>][--help][--version][输入文件][输出文件]

参数

  • -c或--count 在每列旁边显示该行重复出现的次数。
  • -d或--repeated 仅显示重复出现的行列。
  • -f<栏位>或--skip-fields=<栏位> 忽略比较指定的栏位。
  • -s<字符位置>或--skip-chars=<字符位置> 忽略比较指定的字符。
  • -u或--unique 仅显示出一次的行列。
  • -w<字符位置>或--check-chars=<字符位置> 指定要比较的字符。
  • --help 显示帮助。
  • --version 显示版本信息。
  • [输入文件] 指定已排序好的文本文件。如果不指定此项,则从标准读取数据;
  • [输出文件] 指定输出的文件。如果不指定此选项,则将内容显示到标准输出设备(显示终端)。

实例

uniq -c testfile  #检查文件并删除文件中重复出现的行,并在行首显示该行重复出现的次数。当重复的行并不相邻时,uniq 命令是不起作用的,即若文件内容为以下时,uniq 命令不起作用:这时我们就可以使用 sort:

$ sort  testfile1 | uniq

$ sort  testfile1 | uniq -c # 累计重复的次数,显示在最前面

split文件分割

Linux split命令用于将一个文件分割成数个。

该指令将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件。

语法

split [--help][--version][-<行数>][-b <字节>][-C <字节>][-l <行数>][要切割的文件][输出文件名]

参数说明

  • -<行数> : 指定每多少行切成一个小文件
  • -b<字节> : 指定每多少字节切成一个小文件
  • --help : 在线帮助
  • --version : 显示版本信息
  • -C<字节> : 与参数"-b"相似,但是在切 割时将尽量维持每行的完整性
  • [输出文件名] : 设置切割后文件的前置文件名, split会自动在前置文件名后再加上编号

实例

$ split -6 README       #将README文件每六行分割成一个文件 
#获得当前目录结构  以上命令执行后,指令"split"会将原来的大文件"README"切割成多个以"x"开头的小文件。而在这些小文件中,每个文件都只有6行内容。
$ ls                                #执行ls指令  
README xaa xad xag xab xae xah xac xaf xai   

$ split -6 a** README   #新生成的文件用a**为开头分别加上aa  ab ac .....

 

linux 启动流程和服务脚本

liunux 启动流程

一、初始化阶段

1.bios找到磁盘上的MBR主引导扇区

2.进入grub界面选择相应的启动内核

3.读取kernel内核文件-/boot/vmlinuz-*

4.读取init的镜像文件-/boot/initrd-*

5.init去读取/etc/inittab #第一个进程。inittab配置需要启动的进程

6.读取启动级别(id:3:default)// 0/1/2/3/4/5/6   6 重启

二、加载/etc/rc.d/rc.sysinit系统初始化脚本

7.读取/etc/rc.d/rc.sysinit,完成时钟设置,主机名的设置,分区表的挂在(/etc/fstab)设置防火墙,检测硬件变化,启动网络服务//初始脚本,设置磁盘阵列

三、加载/etc/rc.d/rc进程管理脚本

rc3.d 配置了需要启动的进程和关闭的文件。3 默认启动级别 。许多的软链接,实际目录基本都在../init.d/目录下。所有的可控制的脚本和进程

rc3.d 怎么维护的???

8.读取/etc/rc.d/rc脚本,通过该脚本吸收3级别,然后启动/etc/rc.d/rc.3.d下所有以S开头的服务,不启动该目录下以K开头的服务

9.读取/etc/rd.d/rc.loacl脚本

10.启动登录界面

rc3.d 怎么维护的???

chkconfig --level 3  servicename on #配置某个服务默认开启 off默认关闭

chkconfig --list  servicename #查看在所有启动级别下,该服务的启动配置

1.服务脚本

/usr/local/apache2/bin/apachectl

2.开启

/usr/local/apche2/bin/apachectl start|stop|restart

3.开机启动

vi /etc/rc.d/rc.loacl

/usr/local/apch2/bin/apachectl start

 

如何自己写一个脚本。并且可以调配K/S

自定义脚本

把服务脚本改选成标准RPM脚本

通过service把自己定义的脚本进行开启和关闭

通过checkconfig把自定义脚本设置开机启动

 

#!/bin/bash

#服务脚本



case $1 in
    start)
        echo "mytest starting"
        sleep 1
        ;;
    stop)
        echo "mytest stoping"
        sleep 1
        ;;
    restart)
        echo "mytest restarting"
        sleep 1 
        ;;
    *)
        echo "please input start;stop;restart!!!
        ;;
esac

 

chmod  +x mytest

./mytest start/stop/restart

vi /etc/rc.local

add :/mnt/mytest start //重启就可以自动启动了

改造标准rpm 脚本

cp mytest  /etc/rc.d/init.d

checkconfig --list mytest

//就可以service mytest start 启动了

在mytest 里面添加

#chkconfig: 2345 90 20 //启动级别和开启关闭先后关系
#description:mytest server daemon

checkconfig  mytest on

checkconfig --list mytest //就可以查看到配置的各个启动级别下的on or off

 

shell编写字符菜单管理

#/bin/bash
#menu.sh
#my character menu.sh
function menu(){#make as a function
    title="menu"
    url="www.myweb.com
    time='date +%Y-%m-%d'
    cat << eof #输出直到文件末尾
    ###############################################
        ‘echo -e "\033[32;40m$title\033[0m"' 
    ###############################################
    * 1)add a user
    * 2)set password for user
    * 3)delete a user
    * 4)print disk space
    * 5)print men space
    * 6)quit
    * 7)return main menu
    ###############################################
    $url                     $time
    ###############################################
eof
}
#!/bin/bash
#index.sh


. menu.sh #包含文件的意思
clear
menu

while true
do
    read -p "please input a option:" option
    echo $option
    
    case $option in
        1)
            read -p "input the user:" name
            useradd $name &>/dev/null
            if[$? eq 0] ;then
                str="user ${name} is creadted successfully!!!"
                echo -e "\033[30;47m $str\033[0m"
            else
                str="user ${name}  is created failed!!!"
                echo -e "\033[31;47m $str\033[0m"
            fi
            ;;
        2)
            read -p "input the user:" name
            read -p "set password for the user:" pass
            echo $name| passwd --stdin $name &>/dev/null 
            if[$? eq 0] ;then
                str="${name}'s password is set successfully!!!"
                echo -e "\033[30;47m $str\033[0m"
            else
                str="${name}'s password is set successfully!!!"
                echo -e "\033[31;47m $str\033[0m"
            fi
            ;;
        3)
            read -p "delete the user:" name
            userdel -r $name &>/dev/null
            if[$? eq 0] ;then
                str="user ${name} is deleted successfully!!!"
                echo -e "\033[30;47m $str\033[0m"
            else
                str="user ${name}  is deleted failed!!!"
                echo -e "\033[31;47m $str\033[0m"
            fi
            ;;
        4)
            str='free -m'
            echo -e "\033[30;47m $str\033[0m"
            ;;
        5)
            str='df -Th'
            echo -e "\033[30;47m $str\033[0m"
            ;;
        6)
            echo -e "\033[30;47m quit successfully!!!\033[0m"
            break
            ;;
        7)
            clear
            menu
            ;;
    esac
    done

 

shell编写邮件报警脚本

邮件服务器安装

touch web.sh mysql.sh disk.sh mem.sh

chmod a+x *

# nc 命令 了解。 加 ip + port 可互相发送消息

nc -w  localhost port #通信探测命令

#/bin/bash 

#web.sh

nc -w 3 localhost 80

if [$? -eq 0];then
    str="apache's status  is on"
else 
    str="apache's status is off"
fi
echo $str|mail -s 'apache web server' admin@lampym.com
#/bin/bash 

#mysql.sh

nc -w 3 localhost 330 &>/dev/null

if [$? -eq 0];then
    str="mysql's status  is on"
else 
    str="mysql's status is off"
fi
echo $str|mail -s 'mysql server' admin@lampym.com
#/bin/bash 

#disk.sh

ds='df |awk '{if(NR==3){print int($4)}}''

if [$ds -lt 45];then
    str="disk's status  is normal,ds is $ds"
else 
    str="disk's status is abnormal,ds is $ds"
fi
echo $str|mail -s 'disk spce' admin@lampym.com
#/bin/bash 

#mem.sh

use='free -m |awk '{if(NR==2){print int($3)}}'' #计算内存使用率 第二行第三列除以第二列
tot='free -m |awk '{if(NR==2){print int($2)}}'' 
per=$use*100/$tot #不能保存小数

if [$per -lt 90];then
    str="mem's status  is normal,mem is $per"
else 
    str="mem's status is abnormal,mem is $per"
fi
echo $str|mail -s 'mem spce' admin@lampym.com

整合成一个monitor.sh 定时执行

crontab  -e  # 07 00 * * * /mnt/monitor.sh

crontab -l # 可以查看配置任务

 

shell信号捕捉和日志处理

日志文件

logger生成系统日志

信号类型

trap信号捕捉

以时间为标志的日志文件

以进程号为标志的临时文件

 

yum install -y apache

locate http#找位置

cd /var/log #有apache 日志

创建一个时间日志

#!/bin/bash
#createlog

today=`date '+%Y-%m-%d'`

filelog="${today}.log"

if [ ! -e  $filelog ]
then
	touch $filelog 
fi

echo "`date '+%Y-%m-%d %T'` log input start" >> $filelog
sleep 5

echo "`date '+%Y-%m-%d %T'` log input end" >> $filelog

echo "filelog record end!"

系统日志

/var/log/message

logger 向系统日志发送日志

以进程号为名称的日志

#!/bin/bash
#processlog.sh
#获取到http的进程号
#把进程号存入临时文件中
#取出所有进程号
#for 杀死所有进程
#删除之前生成的临时文件
#输出关闭进程后的消息

tmpfile=$$.txt #当前进程号命名,进程关闭就删除了临时文件
ps -e|grep httpd|awk '{print $1}' >>$tmpfile

for pid in `cat  $tmpfile`
do
    echo "apache ${pid} is killed!!!"
    kill -9 $pid
    sleep 1

done

rm -rf $tmpfile
echo "apache is killed successfully"

信号捕捉

kill -l  |wc -l #64种的信号

1 挂起进程/SIGHUP

2 中断  ctl+c /SIGINT

3从键盘退出 ctrl +\ /SIGQUIT

9 无条件终止 /SIGKILL

kill -1 process_pid //传递信号给进程

trap 信号捕捉命令

#!/bin/bash
#trap.sh

#不采取任何行动
#捕捉信号,忽略
#捕捉信号,采取行动

#trap function signal 函数,信号
trap 'myfunc' 2



function myfunc()
{
    echo "deal with signal"
}

i=0
while :
do
    let i++
    echo $i
    sleep 1
done

#!/bin/bash
#trap.sh

#不采取任何行动
#捕捉信号,忽略
#捕捉信号,采取行动

#trap function signal 函数,信号
trap 'myfunc' 2



function myfunc()
{
    echo "deal with signal"
    read -p "if you want to kill the process?y or n" flag
    case $flag in
        'y')
            exit;
            ;;
        'n')
            ;;
        *)
            myfunc
            ;;
    esac
}           


i=0
while :
do
    let i++
    echo $i
    sleep 1
done

 

shell怎么操作MYSQL数据库

登录MySQL服务器

Mysql -uroot -p123

查看数据库

show databases

查看表

show tables from db

查看表结构

desc table

shell 脚本如何操作MySQL

#!/shell/bash
#mysql.sh

mysql="/user/local/mysql/bin/mysql -uroot -p123"
sql_show_db="show databases"


sql_create_db="create table test.user(
id int unsigned auto_increment primary key,
username varchar(50},
password varchar(50)
)"
sql_show_tab_db="show tables from test"
sql_show_desc_tab="desc user"
sql_select_tab="select * from user"

sql_insert_tab="insert into test.user(username,password) value('user1','123')"
sql_update_tab="update test.user set password='123' where id=5"
sql_delete_tab="delete from test.user where id=5"
sql_drop_tab="drop test.user"
sql_drop_db="drop database test"

$mysql -e "$sql"

实例2 优化

#!/bash/bin
#mysql.sh
conn="/user/local/mysql/bin/mysql -uroot -p123"

case $1 in
    select)
        sql="select * from test.user order by id"
        ;;
    delete)
        sql="delete from test.user where id=$2"
        ;;
    insert)
        sql="insert into test.user(username,password) value('$2','$3')"
        ;;
    update)
        sql="update test.user set username='$3',password='$4' where id=$2"\
        ;;
    *)
        sql="select * from test.user order by id"
        ;;
esac
$conn -e "$sql"

apache 日志分割

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值