linux服务脚本编写



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/

时间: 2024-12-27 05:31:50

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

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

shell脚本编程是linux运维工程师必备的技能,也是非常重要的一个技能,所以把shell编程学好,只有好处.基础语法我也就不讲了,学过C语言这些语言的,稍微看一下就能明白shell编程的基础,所以我们直接切入正题. 开班第20天: 今天的课程大纲: shell编程中的函数 编写一个自动挂载的脚本 利用autofs怎么实现自动挂载 文件锁和信号捕获trap sed流文件编辑器 详细讲解: shell编程中的函数 shell中,我们定义函数的方法有两种: 下面调用的时候,直接调用函数名就可以了

dropbear编译安装及服务脚本编写

编译安装 下载dropbear.并解压 # wget http://matt.ucc.asn.au/dropbear/releases/dropbear-2015.67.tar.bz2  # tar xvf dropbear-2015.67.tar.bz2 # cd dropbear-2015.67 # ./configure --prefix=/usr/local/dropbear --sysconfdir=/etc/dropbear 编译安装dropbear,要指定安装dropbear的哪些

编译安装bind及SysV服务脚本编写

1.解析程序包 # wget http://ftp.isc.org/isc/bind9/9.7.3/bind-9.7.3.tar.gz    # tar xvf bind-9.7.3.tar.gz    # cd bind-9.7.3.tar.gz # ./configure --prefix=/usr/local/bind9 --sysconfdir=/etc/named/ --disable-ipv6 --enable-threads --enable-epoll --disable-chr

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

源码如下: #!/bin/bash #该脚本用于自动化搭建本地yum仓库 #挂载光盘 #作者:雨中落叶 #博客:https://www.cnblogs.com/yuzly/ mount /dev/sr0 /mnt &>/dev/null #搭建本地仓库 cd /etc/yum.repos.d cat >>yuzly.repo<<OK [yuzly] name=yuzly baseurl=file:///mnt enabled=1 gpgcheck=1 gpgkey=f

Linux Shell脚本编写——呈现数据(五)

Linux系统将每个对象当做文件来处理.这包括输入和输出的过程.Linux用文件描述符来标识每个文件对象.文件描述符是一个非负整数,可以唯一地标识会话中打开的文件.每个过程一次最多可以有9个文件描述符.出于特殊目的,bash shell保留了最早的3个文件描述符(0.1和2) Linux的标准文件描述符 文件描述符 缩写 描述 0 STDIN 标准输入 1 STDOUT 标准输出 2 SRDERR 标准错误 STDIN STDIN文件描述代表shell的标准输入.对于终端界面来说,标准输入就是键

linux shell脚本编写

大家好 这是一篇自己阅读.学习的shell编程,工作中大量应用,尤为awk.sed.grep为主.希望对大家速成有用 可以直接翻看到中部位置 [data] export PATH=/mall/jdk/jdk1.7/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin export LANG=zh_CN.GB18030 start=`date +%s -d "2011-11-28 15:55:37&qu

Linux Shell脚本编写——使用结构化命令(二)

结构化命令中,最基本的类型就是if-then语句 if command then command fi bash shell的if语句会执行if行定义的那个命令,如果命令的退出状态码是0,则代表成功执行,位于then部分的命令就会执行.如果if行定义的命令的退出状态码是其他,则then部分的命令将不会执行,且if-then语句不能测试跟命令的退出状态码无关的条件 代码2-1 [email protected]:/data# cat demo1 #!/bin/bash if date then e

Linux Shell脚本编写——构建基本脚本(一)

创建shell脚本 在创建shell脚本文件,必须在文件的第一行指定要使用的shell,其格式为: #!/bin/bash 创建.执行sh脚本 代码1-1 [email protected]:/data# cat demo1 #/bin/bash date who [email protected]:/data# ls -l total 4 -rw-r--r-- 1 root root 21 Dec 1 13:59 demo1 [email protected]:/data# chmod u+x

Linux Shell脚本编写——使用结构化命令(四)

命令行参数 向shell脚本传数据的最基本方法是使用命令行参数,命令行参数允许在运行脚本时向命令行添加数据值 读取参数 bash shell会将一些称为位置参数的特殊变量分配给命令行输入的所有参数,甚至包括shell执行的程序的名字,$0是程序名,$1是第一个参数,$2是第二个参数 代码4-1 [email protected]:/data# cat demo1 #!/bin/bash factorial=1 for ((i=1;i<=$1;i++)) do factorial=$[ $fact