1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
 
#!/bin/bash
 
### BEGIN INIT INFO
# Provides: 应用程序开发者
# RequiRED-Start: $all
# RequiRED-Stop: $all
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: 简短应用程序描述
# Description: 详细应用程序描述
### END INIT INFO
 
# 程序文件目录
ROOT="/work/code/cusflo-server-moon"
# 程序文件
APP="./dog/client_update_dog.py"
# 程序配置文件
CONFIG="./server_config.ini"
# 服务日志
DEFAULT_LOG_FILE='./daodaoliang.log'
 
# 样式定制
RED="\\e[31m"
GREEN="\\e[32m"
YELLOW="\\e[33m"
BLACK="\\e[0m"
POS="\\e[60G"
 
ok_msg() {
echo -e "${1}${POS}${BLACK}[${GREEN} OK ${BLACK}]"
}
 
failed_msg() {
echo -e "${1}${POS}${BLACK}[${RED}FAILED${BLACK}]"
}
 
# load process info of app
# exist return 0
# no exist return 1
load_process_info() {
# get pid
app_pid=$(ps -ef|grep ${APP}|gawk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ')
# check pid again
ps -p ${app_pid} >/dev/null 2>/dev/null
ret=$?; if [[ 0 -ne $ret ]]; then error_msg="process $app_pid does not exists"; return 1; fi
return 0;
}
 
start() {
# if exists, exit.
load_process_info
if [[ 0 -eq $? ]]; then failed_msg "${APP} started(pid ${app_pid}), should not start it again."; return 0; fi
 
# not exists, start server
ok_msg "Starting ${APP}..."
 
# get log file
log_file=`cd ${ROOT} && cat ${CONFIG} |grep '^log_file'| awk '{print $2}'| awk -F ';' '{print $1}'`
if [[ -z $log_file ]]; then log_file=${DEFAULT_LOG_FILE}; fi
# get abs path
log_dir=`dirname $log_file`
log_file=`(cd ${ROOT} && cd $log_dir && pwd)`/`basename $log_file`
 
# TODO: FIXME: set limit by, for instance, "ulimit -HSn 10000"
if [[ -z $log_file ]]; then
(cd ${ROOT};nohup python ${APP} >/dev/null 2>&1 &)
else
(cd ${ROOT};nohup python ${APP} >/dev.null >> $log_file 2>&1 &)
fi
 
# check again after start server
for ((i = 0; i < 5; i++)); do
# sleep a little while, for app may start then crash.
sleep 0.1
load_process_info
ret=$?; if [[ 0 -ne $ret ]]; then
failed_msg "${APP} start failed";
failed_msg "see $log_file";
return $ret;
fi
done
 
# check whether started.
load_process_info
ret=$?; if [[ 0 -eq $? ]]; then ok_msg "${APP} started(pid ${app_pid})"; return 0; fi
 
failed_msg "${APP} not started"
return $ret
}
 
stop() {
# not start, exit
load_process_info
if [[ 0 -ne $? ]]; then failed_msg "${APP} not start."; return 0; fi
 
ok_msg "Stopping ${APP}(pid ${app_pid})..."
 
# process exists, try to kill to stop normally
for((i=0;i<30;i++)); do
load_process_info
if [[ 0 -eq $? ]]; then
kill -s SIGTERM ${app_pid} 2>/dev/null
ret=$?; if [[ 0 -ne $ret ]]; then failed_msg "send signal SIGTERM failed ret=$ret"; return $ret; fi
sleep 0.1
else
ok_msg "${APP} stopped by SIGTERM"
# delete the pid file when stop success.
rm -f ${pid_file}
break;
fi
done
 
# process exists, use kill -9 to force to exit
load_process_info
if [[ 0 -eq $? ]]; then
kill -s SIGKILL ${app_pid} 2>/dev/null
ret=$?; if [[ 0 -ne $ret ]]; then failed_msg "send signal SIGKILL failed ret=$ret"; return $ret; fi
ok_msg "${APP} stopped by SIGKILL"
else
# delete the pid file when stop success.
rm -f ${pid_file}
fi
 
sleep 0.1
return 0
}
 
# get the status of srs process
# @return 0 if srs is running; otherwise, 1 for stopped.
status() {
load_process_info
ret=$?; if [[ 0 -eq $ret ]]; then echo "${APP}(pid ${app_pid}) is running."; return 0; fi
 
echo "${APP} is stopped, $error_msg"
return 1
}
 
menu() {
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
status
;;
*)
echo "Usage: $0 {start|stop|status|restart}"
return 1
;;
esac
}
 
menu $1
 
code=$?
exit ${code}
 
 
 
 
http://daodaoliang.com/linux%E5%AD%A6%E4%B9%A0/2015/02/04/linux%E5%AD%A6%E4%B9%A0-2015-02-04-%E6%9C%8D%E5%8A%A1%E8%84%9A%E6%9C%AC%E7%BC%96%E5%86%99/

linux服务脚本编写的更多相关文章

  1. shell编程之服务脚本编写,文件锁以及信号捕获

    shell脚本编程是linux运维工程师必备的技能,也是非常重要的一个技能,所以把shell编程学好,只有好处.基础语法我也就不讲了,学过C语言这些语言的,稍微看一下就能明白shell编程的基础,所以 ...

  2. Linux 用脚本编写搭建yum本地仓库

    Linux 用脚本编写搭建yum本地仓库 源码如下: #!/bin/bash #该脚本用于自动化搭建本地yum仓库 #挂载光盘 #作者:雨中落叶 #博客:https://www.cnblogs.com ...

  3. nginx 服务脚本编写模板

    编写nginx服务脚本:脚本内容如下: [root@www ~]# cat /etc/init.d/nginx #!/bin/bash # nginx Startup script for the N ...

  4. linux base脚本编写-自动领取微信红包

    bash脚本编写 语法 变量 定义: your_name = "ABC" 使用: echo $your_name 只读变量 a = "123" readonly ...

  5. linux服务脚本

    #!/bin/sh ARG=$1 case $ARG in start): nohup /path/program & ;; stop): pkill program ;; restart): ...

  6. 10个实战及面试常用Linux Shell脚本编写

    来自:http://blog.51cto.com/lizhenliang/1929044 注意事项 1)开头加解释器:#!/bin/bash 2)语法缩进,使用四个空格:多加注释说明. 3)命名建议规 ...

  7. linux Shell 脚本编写

    1. http://www.jb51.net/article/28514.htm 2. http://www.runoob.com/linux/linux-shell.html

  8. 简单的linux service(linux服务)编写,运行示例

    1.写一个简单小程序 #include<stdio.h> #include<stdlib.h> int main(int argc,char **argv) { while(1 ...

  9. linux 服务脚本

    #!/bin/bash # # chkconfig: # description: my_SERVICE_NAME is a my Service # # common function . /etc ...

随机推荐

  1. produces在@requestMapping中的使用方式和作用

    produces可能不算一个注解,因为什么呢,它是注解@requestMapping注解里面的属性项, 它的作用是指定返回值类型,不但可以设置返回值类型还可以设定返回值的字符编码: 还有一个属性与其对 ...

  2. Qt 子窗口内嵌到父窗口中

    有时需要把一个子窗口内嵌进入父窗口当中. 我们可以这样做 1.新建一个QWidget 或者QDialog的子类 ClassA(父类为ClassB) 2.在新建类的构造函数中添加设置窗口属性 setWi ...

  3. [Angular] @ViewChildren and QueryLists (ngAfterViewInit)

    When you use @ViewChildren, the value can only be accessable inside ngAfterViewInit lifecycle. This ...

  4. amazeui中内置的web组件有哪些且如何用

    amazeui中内置的web组件有哪些且如何用 一.总结 一句话总结: 1.组件还是jquery.js+amazeui.js,和插件一样,准确的说是amazeui.css+jquery.js+amaz ...

  5. JUnit中@Test的运行顺序

    原文链接: Test execution order 原文日期: 2012年12月06日 翻译日期: 2014年10月16日 翻译人员: 百里马 依照设计,Junit不指定test方法的运行顺序. 到 ...

  6. No handler for type [text] declared on field [content]

    Install 1.compile checkout ik version respective to your elasticsearch version git checkout tags/{ve ...

  7. WPF 在image控件用鼠标拖拽出矩形

    原文:WPF 在image控件用鼠标拖拽出矩形 版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问.如果当前博客图片看不到,请到 http://lindexi.gitee ...

  8. Java10 新特性

    Java 10 新特性 这次发布的 Java 10,新带来的特性并不多. 根据官网公开资料,共有 12 个 JEP(JDK Enhancement Proposal 特性加强提议),带来以下加强功能: ...

  9. Objective-C block实现代码分析

    block内部结构 让我们写一个block void exampleBlock() { // NSConcreteStackBlock int a = 1; __block int b = 2; in ...

  10. Linux性能测试 strace命令

    1  功能说明 strace 命令是一种强大的工具 ,  能够显示任何由用户空间程式发出的系统调用 .  strace 显示这些调用的参数并返回符号形式的值 .  strace 从内核接收信息 ,  ...