Shell学习笔记

编写shell脚本 文件名字起 start.sh

#!/bin/bash
#定义变量server的名字
server_name="ccn.paas.service"
#服务启用时的运行参数
server_path="nohup java -jar -Djava.ext.dirs=$JAVA_HOME/jre/lib/ext:./:./lib:./plugins ccn.paas.service.jar > /dev/null 10240 &"

#启动方法
start(){
#输出 --start-
    echo "--start-"
#  $server_path  引用刚才定义的服务启动的运行参数 
    ($server_path) &
#查出启动的进程pid 赋值给pid
    pid=$(ps -ef|grep $server_name |grep -v grep |awk '{print $2}')
#判断pid是都有值,就是判断服务是否启动
    if [ ! $pid ]; then
#如果服务没有启动 输出  service is not exit ...
        echo "service is not exit ..."
    else
#否则输出pid的值 如pid=12345
        echo "pid=$pid"
#关闭if判断
    fi  
}
 
stop(){
    pid=$(ps -ef|grep $server_name |grep -v grep |awk '{print $2}')
    if [ ! $pid ]; then
        echo "service is not exit ..."
    else
        kill -9 $pid
    fi  
}

restart(){
    pid=$(ps -ef|grep $server_name |grep -v grep |awk '{print $2}')
    if [ ! $pid ]; then
        echo "service is not exit ..."
		start
    else
        kill -9 $pid
		start
    fi  
}
 
checkrun(){ 
    while true
    do
        pid=$(ps -ef|grep $server_name |grep -v grep |awk '{print $2}')
        if [[ $pid -eq 0 ]]; then
            echo "--restart-"
            start 
        fi  
 
        sleep 30s 
    done
}
#或输入参数1 比如 启动文件 ./start.sh start  stop  restart
#$1 的值就是传递的值  start
#$2 的值就是传递的值  stop
#$3 的值就是传递的值  restart
#判断 传入值是什么就比较执行什么方法
case $1 in
#当传入参数是 start 就执行start方法
start):
    start
    ;;
stop):
    echo "--stop"
    stop
    ;;
restart):
    echo "--restart"
    restart
    ;;
checkrun):
    echo "--restart"
    checkrun
    ;;
*):
    echo "error ..."
    ;;
esac

exit 0
复制代码
重启执行 
./start.sh start
停止执行
./start.sh stop
重启执行 
./start restart
复制代码

我们在Windows上面编写shell文件后上传linux服务器上后执行会报错

报错1:

#执行
[root@10-20-31-41 paas2]# ./start.sh 
#报错没有权限
-bash: ./start.sh: Permission denied
#执行命令富裕权限
[root@10-20-31-41 paas2]# chmod a+x start.sh

复制代码

报错2:

[root@10-20-31-41 paas2]# ./start.sh restart
-bash: ./start.sh: /bin/bash^M: bad interpreter: No such file or directory
复制代码
  • 在Windows上面编写shell脚本文件是dos格式,即每一行结尾以\r\n来标识,而unix格式的文件行尾则以\n来标识。查看脚本文件是dos格式还是unix格式的几种办法。
1. cat -A start.sh  从显示结果可以判断,dos格式的文件行尾为^M$,unix格式的文件行尾为$
2. od -t x1 start.sh 如果看到输出内容中存在0d 0a的字符,那么文件是dos格式,如果只有0a,则是unix格式
3. vi start.sh 打开文件,执行 : set ff,如果文件为dos格式在显示为fileformat=dos,如果是unxi则显示为fileformat=unix
复制代码

解决方法1:

[root@localhost bin]# dos2unix start.sh
dos2unix: converting file start.sh to UNIX format ...
复制代码

解决方法2:

vim start.sh
 
:get fileformat          #查看本文件的格式
:set fileformat=unix     #设置文件为unix
:wq                      #保存
复制代码

解决方法3:

#使用sed命令,直接替换结尾符为unix格式
 
sed -i "s/\r//" start.sh
或者 
sed -i "s/^M//" start..sh
复制代码

以上问题解决后就可以正常启动了

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享