编译安装nginx && shell的trap信号控制
源码安装nginx脚本要求和脚本
# 安装路径和配置文件路径
#!/bin/bash
# Author:kakaops
# Email:[email protected]
#shell: 写一个脚本编译安装nginx
#1、脚本只能在/opt下执行
#2、脚本只能有root用户执行
#3、可以由用户输入版本
#4、用户执行安装路径和配置文件路径
#5、安装完成做好环境变量,方便用户可以直接操作
#6、扩展:如果用户不想安装了(ctrl+c) 那么清理环境
source /etc/init.d/functions
trap "rm_rvf" 2
rm_rvf(){
rm -rvf /opt/nginx/*
rm -rvf "$install_path"
rm -rvf "$conf_path"
mv "$install_path"{
.bak,}
mv "$conf_path"{
.bak,}
rm -rvf /usr/local/nginx/
rm -rvf /var/log/nginx/
rm -rvf /var/lock/nginx
exit
}
# 判断当前路径是不是/opt
curl_path=`pwd`
[ "$curl_path" != "/opt" ] && echo "请在/opt目录下执行" && exit
# 判断当前是否root账户(也可以判断$UID是不是0来进行判断是不是root用户)
[[ ! $(id |awk -F'[()]' '{
print $2}') =~ root ]] && failure && echo "请用root账户执行" && exit
# 判断yum源是否可用
yum repolist &>/dev/null
[ $? -ne 0 ] && echo "yum源不可以用于安装依赖环境" && exit || echo "yum 可以使用"
# 选择安装的版本
while true
do
echo "请选择要安装版本号(16、17、18、19)"
read -p ">>:" num
if [ "$num" ] && [[ "$num" =~ ^[0-9]+$ ]];then
install_url=http://nginx.org/download/nginx-1."$num".0.tar.gz
break
else
failure ; echo -e "\e[5;31m输入有误,请重新输入\e[0m"
continue
fi
done
#http://nginx.org/download/nginx-1.16.0.tar.gz
#http://nginx.org/download/nginx-1.17.0.tar.gz
#http://nginx.org/download/nginx-1.18.0.tar.gz
#http://nginx.org/download/nginx-1.19.0.tar.gz
# 安装路径和配置文件路径
while true
do
read -p "输入nginx安装路径>>:" install_path
read -p "输入nginx配置文件路径>>:" conf_path
cd "$install_path" &>/dev/null && cd "$conf_path" &>/dev/null
if [ $? -eq 0 ] && [ "$install_path" ] && [ "$conf_path" ];then
break
else
n=${install_path:0:1}
m=${conf_path:0:1}
if [[ "$n" =~ "/" ]] && [[ "$m" =~ "/" ]];then
mkdir "$install_path" &>/dev/null
mkdir "$conf_path" &>/dev/null
break
else
echo "输入错误,请重新输入"
continue
fi
fi
done
# 安装nginx
yum -y install gcc gcc-c++
yum install -y pcre pcre-devel
yum install -y openssl openssl-devel
yum install -y zlib zlib-devel
useradd nginx
yum -y install wget
wget "${install_url}"
tar xzf nginx-1."$num".0.tar.gz -C /usr/local/
cd /usr/local/nginx-1."$num".0
wget https://github.com/openresty/echo-nginx-module/archive/v0.61.tar.gz
tar xf v0.61.tar.gz
./configure --prefix="${install_path}" --group=nginx --user=nginx --sbin-path=/usr/local/nginx/sbin/nginx --conf-path="${conf_path}"/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/tmp/nginx/client_body --http-proxy-temp-path=/tmp/nginx/proxy --http-fastcgi-temp-path=/tmp/nginx/fastcgi --pid-path=/var/run/nginx.pid --lock-path=/var/lock/nginx --with-http_stub_status_module --with-http_ssl_module --with-http_gzip_static_module --with-pcre --with-http_realip_module --with-stream # --add-module=./echo-nginx-module-0.61 --add-module=./ngx_req_status-master
make && make install
export PATH=$PATH:/usr/local/nginx/sbin/
# 配置环境变量方便用户使用
cat >/etc/profile/nginx.conf<<EOF
export NGINX_HOME=${install_path}
export PATH=${install_path}/sbin:$PATH
EOF
脚本中用到的命令解析
cat命令的用法
覆盖原有文本:
cat >test.txt<<EOF
the 1 line
the 2 line
the 3 line
EOF
追加的原有文本尾部:
cat >>test.txt<<EOF
the 4 line
the 5 lien
EOF
">“覆盖符号,”>>"追加符号
对多个变量及多行输出到文件,存在变量自动替换,当使用cat<<EOF不想对内容进行变量替换、命令替换、参数展开等
防止变量替换
一、对 $·\ 进行转义
cat >> a.sh << EOF
echo \`hostname\`
echo $HOME
EOF
二、在分界符EOF前添加反斜杠\,或者用单引号、双引号括起来
cat >> a.sh << \EOF
echo `hostname`
echo $HOME
EOF
cat >> a.sh << "EOF"
echo `hostname`
echo $HOME
EOF
cat >> a.sh << 'EOF'
echo `hostname`
echo $HOME
EOF
EOF随意替换,但最后EOF一个一定要顶格写
cat命令合并文件
3.将几个文件合并为一个文件: $cat file1 file2 > file
参数:
-n 或 --number 由 1 开始对所有输出的行数编号
-b 或 --number-nonblank 和 -n 相似,只不过对于空白行不编号
-s 或 --squeeze-blank 当遇到有连续两行以上的空白行,就代换为一行的空白行
-v 或 --show-nonprinting
例:
把 textfile1 的档案内容加上行号后输入 textfile2 这个档案里
cat -n textfile1 > textfile2
exit后面的数字
当你 exit 0 的时候,在调用环境 echo $? 就返回0,也就是说调用环境就认为你的这个程序执行正确
当你 exit 1 的时候,一般是出错定义这个1,也可以是其他数字,很多系统程序这个错误编号是有约定的含义的。 但不为0 就表示程序运行出错。 调用环境就可以根据这个返回值判断 你这个程序运行是否ok。
如果你用 脚本 a 调用 脚本b ,要在a中判断b是否正常返回,就是根据 exit 0 or 1 来识别。
执行完b后, 判断 $? 就是返回值
exit number
number的范围是0~255
超过255的
256表示0,就是再一次0~255循环,以此类推
trap命令
三、trap命令进行shell脚本信号处理
trap是一个shell内建命令,trap命令是专用于捕捉信号的。比如像ctrl+c发送给终端的中断信号等等。在捕捉到信号之后,可以进行一系列的操作,可以通过键盘进行信号的发送,也可以用kill signal pid 进行信号的发送
trap “commands” signals(双引号)
trap “” signals 忽略信号signals,trap “” 1 2 3 24 或 trap “” HUP INT QUIT TSTP
可以多个,比如 trap “” INT 表明忽略SIGINT信号,按Ctrl+C也不能使脚本退出。又如 trap “” HUP 表明忽略SIGHUP信号,即网络断开时也不能使脚本退出
trap signals 恢复信号,用 trap 1 2 3 24 或 trap HUP INT QUIT TSTP使其回复默认值
如果没有指定命令部分,那么就将信号处理复原。比如 trap INT 就表明恢复Ctrl+C退出
trap -p signal 把当前的trap设置打印出来
trap -l 把所有信号打印出来,可以直接用信号前面的数字代表信号,stty -a可以列出中断信号与键盘的对应
trap “commands” EXIT 脚本退出时执行commands指定的命令
我们可以用在shell脚本中用trap定义我们自己的信号处理程序,就象在c中用signal一样
Linux信号简介
- SIGHUP 本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联.
- SIGINT 程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出
- SIGQUIT 和SIGINT类似, 但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号.
- SIGILL 执行了非法指令. 通常是因为可执行文件本身出现错误, 或者试图执行数据段. 堆栈溢出时也有可能产生这个信号.
- SIGTRAP 由断点指令或其它trap指令产生. 由debugger使用.
- SIGABRT 程序自己发现错误并调用abort时产生.
- SIGIOT 在PDP-11上由iot指令产生, 在其它机器上和SIGABRT一样.
- SIGBUS 非法地址, 包括内存地址对齐(alignment)出错. eg: 访问一个四个字长的整数, 但其地址不是4的倍数.
- SIGFPE 在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误.
- SIGKILL 用来立即结束程序的运行. 本信号不能被阻塞, 处理和忽略.
- SIGUSR1 留给用户使用
- SIGSEGV 试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.
- SIGUSR2 留给用户使用
- SIGPIPE Broken pipe
- SIGALRM 时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数使用该信号.
- SIGTERM 程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理. 通常用来要求程序自己正常退出. shell命令kill缺省产生这个信号.
- SIGCHLD 子进程结束时, 父进程会收到这个信号.
- SIGCONT 让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作. 例如, 重新显示提示符
- SIGSTOP 停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别: 该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.
- SIGTSTP 停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号
- SIGTTIN 当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号. 缺省时这些进程会停止执行.
- SIGTTOU 类似于SIGTTIN, 但在写终端(或修改终端模式)时收到.
- SIGURG 有紧急数据或out-of-band数据到达socket时产生.
- SIGXCPU 超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/改变
- SIGXFSZ 超过文件大小资源限制.
- SIGVTALRM 虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间.
- SIGPROF 类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的时间.
- SIGWINCH 窗口大小改变时发出.
- SIGIO 文件描述符准备就绪, 可以开始进行输入/输出操作.
- SIGPWR Power failure