linux的functions之killproc函数详解
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
|
# 该函数的作用是关闭进程的.
# 用法:
# killproc [-p pidfile] [-d delay] <program> [-signal]
# -p: 指定进程的pid文件,一般在/var/run/xxx.pid
# -d: 指定延迟多长时间就强度关闭进程
# -signal: 关闭进程的信号
# A function to stop a program.
killproc() {
local RC killlevel= base pid pid_file= delay
# 定义局部变量,只在函数体内有效。
RC=0; delay=3 # 默认延迟3秒,不能正常关闭就强制关闭
# Test syntax. # 判断用户调用该函数时,给的参数格式。并使用变量记录下来
if [ "$#" - eq 0 ]; then
echo $"Usage: killproc [-p pidfile] [ -d delay] {program} [-signal]“
# 如果调用该函数时,不使用任何参数的话将给用户输出使用该函数的使用方法。
return 1 # 退出该函数。
fi
if [ "$1" = "-p" ]; then
# 如果参数1,是字符 -p 的话,那么用户输入的第二个参数就是:
# 程序的pid_file文件。通常是/var/run/XXX.pid
pid_file=$2
shift 2
fi
if [ "$1" = "-d" ]; then
delay=$2
# 记录的参数的作用是用来。如果进程在正常情况下不能关闭,
# 延迟多长时间就向该进程发送SIGKILL信号强制关闭。
shift 2
fi
# check for second arg to be kill level
# 检查用户是否指定函数关闭进程时,所使用的信号。
[ -n "${2:-}" ] && killlevel=$2
# Save basename. # 保存进程的二进制运行文件的。
base=${1 ##*/} # 参数替换,把程序的二进制文件的路径名***掉。
####################################################################
# 查找可运行二进制程序的进程号PID 部分
# Find pid.
__pids_var_run "$1" "$pid_file"
#调用 函数:__pids_var_run 来检查用户指定的程序的进程号。
# 该函数会使用一个变量:PID记录程序的进程号的。
if [ -z "$pid_file" -a -z "$pid" ]; then
# 如果pidfile文件不存在,并且找不到进程的pid号。
# 就使用该方法查找该程序$base的PID号。
pid= "$(__pids_pidof " $1 ")"
fi
#####################################################################
# Kill it.
# 找到二进制可运行程序的进程号,是如果关闭进程的
if [ -n "$pid" ] ; then
# 如果$PID 不为空,证明进程运行的。就执行 then 后的内容
[ "$BOOTUP" = "verbose" -a -z "${LSB:-}" ] && echo -n "$base "
if [ -z "$killlevel" ] ; then
#如果用户没有指定函数要使用关闭进程的信号的话,就执行 then后的内容
if checkpid $pid 2>&1; then
# 调用函数:checkpid 来判断进程号为:$PID的进程是否
#运行。其实 checkpid是判断$PID,如果伪目录/proc
#下是否有一个目录名和$PID相同
# TERM first, then KILL if not dead
kill -TERM $pid > /dev/null 2>&1
# 给进程$PID发送 -15信号。等待进程关闭资源后,
# 再杀死该进程。
usleep 100000 #等待100000 微秒
if checkpid $pid && sleep 1 &&
#再使用函数checkpid检查,如果进程还运行的话,
#再等待1秒,
checkpid $pid && sleep $delay &&
#再使用函数checkpid检查,如果进程还运行的话,
#就使用用户给的延迟时间,再等待
checkpid $pid ; then
#在用户给的延时时间到了,再次使用函数
#checkpid检查,如果进程还是运行的
# 话,就强制关闭。
kill -KILL $pid > /dev/null 2>&1
# 给进程$PID发送 -9 信号,强制关闭该进程。
usleep 100000
fi
fi
checkpid $pid # 再次确认下,进程$PID是否是关闭的。
RC=$?
# 记录函数checkpid的返回结果。
# 如果是:0 的话就代表关闭进程$PID成功。
[ "$RC" - eq 0 ] && failure $ "$base shutdown" || success $ "$base shutdown"
# 判断函数checkpid的返回值,给用户输出进程是否关闭成功的信 RC=$((! $RC))
# 对变量RC进行,非操作,避免下面使用该变量时,判断有误。
# use specified level only
#调用函数:killproc时传递有关闭进程的信号就执行else 后的程序
else # 如果用户给函数killproc 传递了关闭进程所使用的信号,
#就执行else后的代码
# 作用想要通知进程重读配置文件时, 可以传递一个 -HUP 信号给进程。
if checkpid $pid; then #使用函数checkpid检查,进程$PID是否运行的,
kill $killlevel $pid > /dev/null 2>&1
#使用用户传递关闭进程的信号来关闭进程$PID
RC=$? #记录函数checkpid的返回结果。
[ "$RC" eq 0 ] && success $ "$base $killlevel" || failure $ "$base $killlevel"
# 根据$RC判断进程$PID是否关闭成功
elif [ -n "${LSB:-}" ]; then
RC=7 # Program is not running
fi
fi
###########################找不到二进制可运行程序的进程号
else
if [ -n "${LSB:-}" -a -n "$killlevel" ]; then
RC=7 # Program is not running
else
failure $ "$base shutdown"
RC=0
fi
fi
# Remove pid file if any.
if [ -z "$killlevel" ]; then
rm -f "${pid_file:-/var/run/$base.pid}"
fi
return $RC
}
|
linux的functions之killproc函数详解相关推荐
- 【Linux系统编程】vfork() 函数详解
00. 目录 文章目录 00. 目录 01. vfork函数 02. fork和vfork区别 03. 父子进程地址空间 04. 附录 01. vfork函数 函数分析 #include <sy ...
- 【Linux系统编程】fork()函数详解
00. 目录 文章目录 00. 目录 01. 进程创建函数 02. 父子进程结构 03. 父子进程地址空间 04. 附录 01. 进程创建函数 #include <sys/types.h> ...
- 转:linux中fork()函数详解
转:linux中fork()函数详解 https://blog.csdn.net/jason314/article/details/5640969 转载于:https://www.cnblogs.co ...
- Linux系统调用-- recv/recvfrom/recvmsg函数详解(转)
Linux系统调用-- recv/recvfrom/recvmsg函数详解 2007-09-10 23:37 [recv/recvfrom/recvmsg系统调用] 功能描述: 从套接字上接收一个 ...
- linux Socket send与recv函数详解
转自:http://www.cnblogs.com/blankqdb/archive/2012/08/30/2663859.html linux send与recv函数详解 1 #include &l ...
- linux内核中的hook函数详解,linux内核中的hook函数详解
在编写linux内核中的网络模块时,用到了钩子函数也就是hook函数.现在来看看linux是如何实现hook函数的. 先介绍一个结构体: struct nf_hook_ops,这个结构体是实现钩子函数 ...
- linux hook 任意内核函数,linux内核中的hook函数详解
在编写linux内核中的网络模块时,用到了钩子函数也就是hook函数.现在来看看linux是如何实现hook函数的. 先介绍一个结构体: struct nf_hook_ops,这个结构体是实现钩子函数 ...
- 【Linux系统编程】fork() 函数详解
需要的头文件: #include <sys/types.h> #include <unistd.h> pid_t fork(void); 功能: 用于从一个已存在的进程中创建一 ...
- linux dev queue xmit,dev_queue_xmi函数详解
点击(此处)折叠或打开 int dev_queue_xmit(struct sk_buff *skb) { struct net_device *dev = skb->dev; struct n ...
最新文章
- 【转】android错误 aapt.exe已停止工作的解决方法
- (一)七种AOP实现方法
- Func与Action
- iOS - Flutter混合开发
- APUE学习笔记之UNIX系统概述(1)
- 树莓派-语音聊天机器人+语音控制引脚电平高低
- Heron:来自Twitter的新一代流处理引擎应用篇
- rgb 灰色_金属+RGB+无线,我要买爆这款海盗船VIRTUOSO鉴赏家游戏耳机
- 清华,北大坐实亚洲大学Top2,泰晤士2020亚洲大学榜
- 戴尔服务器哪1顶型号好,戴尔PowerEdge R730xd新一代服务器评测
- LeetCode 121买卖股票的时机
- windows安装adb工具
- 接口解读:你的姓名+身份证号撑起了超11亿元市场规模,你造吗?
- 知识图谱 helloword
- Java-Controller引起的Ambiguous mapping问题解决
- python 安卓平板摄像头_python把手机摄像头当作电脑摄像头
- python出现Unknown label type: 'continuous'问题
- 服务器内网可以打开外网打不开怎么办?网站搭建后打不开怎么办?
- 微信小程序点击弹出输入框
- ibm aix 抓包命令_在IBM AIX上模拟丢弃的TCP / IP数据包
热门文章
- Why Go Is Not Good
- js 操作table: insertRow(),deleteRow(),insertCell(),deleteCell()方法
- Windows 8功能预测
- jQuery在asp.net中实现图片自动滚动
- linux,想说爱你真的很不容易!
- 使用 ale.js 制作一个小而美的表格编辑器(4)
- 聊聊resilience4j的bulkhead
- oracle用户被锁
- 洛谷——P1657 选书
- ActiveReports 报表应用教程 (9)---交互式报表之动态排序