• L58.linux命令每日一练 -- 第九章 Linux进程管理命令 -- pgrep和kill


    9.3 pgrep:查找匹配条件的进程

    9.3.1 命令详解

    【命令星级】 ★★★★☆

    【功能说明】

    ​ pgrep命令可以查找匹配条件的进程号。

    【语法格式】

    pgrep [option] [pattern]
    pgrep [选项]	[匹配添加]
    
    • 1
    • 2

    ​ **说明:**在pgrep命令及后面的选项和匹配条件里,每个元素之间都至少要有一个空格。

    ​ 【选项说明】

    ​ 表9-3针对该命令的参数选项进行了说明。

    ​ 表9-3 pgrep命令的参数选项及说明

    在这里插入图片描述

    9.3.2 使用范例

    ​ **范例9-11:**显示直接进程的pid命令。

    [root@centos7 ~]# pgrep crond
    	#pgrep命令可以看作ps命令和grep命令的结合,pgrep命令指定过滤crond字段,获取到crond进程的进程号。
    858
    
    • 1
    • 2
    • 3

    ​ **范例9-12:**显示指定用户的所有进程号。

    [root@centos7 ~]# pgrep -u root
    	#使用-u选项显示指定root用户的所有进程号。
    1
    2
    4
    5
    6
    7
    8
    9
    10
    11
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    30
    31
    32
    33
    41
    43
    44
    45
    47
    60
    97
    103
    223
    235
    236
    237
    238
    243
    244
    246
    247
    248
    249
    254
    255
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    369
    399
    529
    530
    531
    532
    533
    534
    535
    536
    743
    825
    829
    830
    832
    833
    854
    858
    877
    982
    1311
    1313
    1314
    1475
    2029
    2089
    2140
    2146
    2189
    
    • 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

    9.4 kill:终止进程

    9.4.1 命令详解

    【命令星级】 ★★★★★

    【功能说明】

    ​ kill命令能够终止你希望停止的进程。

    【语法格式】

    kill [option] [pid]
    kill [选项]	[进程号]
    
    • 1
    • 2

    ​ **说明:**在kill命令及后面的选项和进程号里,每个元素之间都至少要有一个空格。

    ​ 【选项说明】

    ​ 表9-4针对该命令的参数选项进行了说明。

    ​ 表9-4 kill命令的参数选项及说明

    在这里插入图片描述

    9.4.2 使用范例

    ​ **范例9-13:**列出所有信号的名称。

    [root@centos7 ~]# kill -l	#参数-l显示系统的所有信号。
     1) SIGHUP	 2) SIGINT	 3) SIGQUIT	 4) SIGILL	 5) SIGTRAP
     6) SIGABRT	 7) SIGBUS	 8) SIGFPE	 9) SIGKILL	10) SIGUSR1
    11) SIGSEGV	12) SIGUSR2	13) SIGPIPE	14) SIGALRM	15) SIGTERM
    16) SIGSTKFLT	17) SIGCHLD	18) SIGCONT	19) SIGSTOP	20) SIGTSTP
    21) SIGTTIN	22) SIGTTOU	23) SIGURG	24) SIGXCPU	25) SIGXFSZ
    26) SIGVTALRM	27) SIGPROF	28) SIGWINCH	29) SIGIO	30) SIGPWR
    31) SIGSYS	34) SIGRTMIN	35) SIGRTMIN+1	36) SIGRTMIN+2	37) SIGRTMIN+3
    38) SIGRTMIN+4	39) SIGRTMIN+5	40) SIGRTMIN+6	41) SIGRTMIN+7	42) SIGRTMIN+8
    43) SIGRTMIN+9	44) SIGRTMIN+10	45) SIGRTMIN+11	46) SIGRTMIN+12	47) SIGRTMIN+13
    48) SIGRTMIN+14	49) SIGRTMIN+15	50) SIGRTMAX-14	51) SIGRTMAX-13	52) SIGRTMAX-12
    53) SIGRTMAX-11	54) SIGRTMAX-10	55) SIGRTMAX-9	56) SIGRTMAX-8	57) SIGRTMAX-7
    58) SIGRTMAX-6	59) SIGRTMAX-5	60) SIGRTMAX-4	61) SIGRTMAX-3	62) SIGRTMAX-2
    63) SIGRTMAX-1	64) SIGRTMAX	
    
    [root@centos6 ~]# kill -l SIGKILL	#可以使用-l参数对信号名和数字信号互换。
    9
    [root@centos6 ~]# kill -l 9
    KILL
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    ​ 表9-5对常用信号进行了说明。

    ​ 表9-5 常用信号
    在这里插入图片描述
    ​ 更多细节请参考signal在线手册的第七部分(man 7 signal)。

    ​ **范例9-14:**终止进程。

    ​ kill指令默认使用的信号为15,用于结束进程。如果进程忽略此信号,则可以使用信号9强制终止进程。

    ​ 一般是先通过ps等命令获取到要终止的进程号,然后直接使用“kill 进程号”就可以了。

    kill 2203	#kill命令默认使用的信号为15,这种格式也是最常用的。
    kill -s 15 2203		#这种格式使用-s参数明确指定发送值为15的信号,效果和kill 2203一样。
    kill -15 2203		#上面的-s 15可以简写为-15。
    
    • 1
    • 2
    • 3

    ​ 如果用上面的方法还是无法终止进程,那么我们就可以用KILL(9)信号强制终止进程。

    kill -9 2203	#信号9会强行终止进程,这会带来一些副作用,如数据丢失,或者终端无法恢复到正常状态等,因此应尽量避免使用,除非进场使用其他信号无法终止。
    
    • 1

    9.4.3 扩展:特殊信号0的应用案例

    ​ 在kill的所有信号中,有一个十分特殊的信号值0,使用格式为kill -0 p i d 。其中的 − 0 表示不发送任何信号给 pid。其中的-0表示不发送任何信号给 pid。其中的0表示不发送任何信号给pid对应的进程,但是仍然会对 p i d 是否存在对应的进程进行检查,如果 pid是否存在对应的进程进行检查,如果 pid是否存在对应的进程进行检查,如果pid对应的进程已存在,则返回0,若不存在则返回1.下面是系统参考脚本/etc/init.d/mysqld。

    [root@centos6 ~]# cat /etc/init.d/mysqld
    #!/bin/sh
    #
    # mysqld	This shell script takes care of starting and stopping
    #		the MySQL subsystem (mysqld).
    #
    # chkconfig: - 64 36
    # description:	MySQL database server.
    # processname: mysqld
    # config: /etc/my.cnf
    # pidfile: /var/run/mysqld/mysqld.pid
    ### BEGIN INIT INFO
    # Provides: mysqld
    # Required-Start: $local_fs $remote_fs $network $named $syslog $time
    # Required-Stop: $local_fs $remote_fs $network $named $syslog $time
    # Short-Description: start and stop MySQL server
    # Description: MySQL database server
    ### END INIT INFO
    
    # Source function library.
    . /etc/rc.d/init.d/functions
    
    # Source networking configuration.
    . /etc/sysconfig/network
    
    
    exec="/usr/bin/mysqld_safe"
    prog="mysqld"
    
    # Set timeouts here so they can be overridden from /etc/sysconfig/mysqld
    STARTTIMEOUT=120
    STOPTIMEOUT=60
    
    [ -e /etc/sysconfig/$prog ] && . /etc/sysconfig/$prog
    
    lockfile=/var/lock/subsys/$prog
    
    
    # extract value of a MySQL option from config files
    # Usage: get_mysql_option SECTION VARNAME DEFAULT
    # result is returned in $result
    # We use my_print_defaults which prints all options from multiple files,
    # with the more specific ones later; hence take the last match.
    get_mysql_option(){
    	result=`/usr/bin/my_print_defaults "$1" | sed -n "s/^--$2=//p" | tail -n 1`
    	if [ -z "$result" ]; then
    	    # not found, use default
    	    result="$3"
    	fi
    }
    
    get_mysql_option mysqld datadir "/var/lib/mysql"
    datadir="$result"
    get_mysql_option mysqld socket "$datadir/mysql.sock"
    socketfile="$result"
    get_mysql_option mysqld_safe log-error "/var/log/mysqld.log"
    errlogfile="$result"
    get_mysql_option mysqld_safe pid-file "/var/run/mysqld/mysqld.pid"
    mypidfile="$result"
    
    
    start(){
        [ -x $exec ] || exit 5
        # check to see if it's already running
        MYSQLDRUNNING=0
        if [ -f "$mypidfile" ]; then
    	MYSQLPID=`cat "$mypidfile" 2>/dev/null`
    	if [ -n "$MYSQLPID" ] && [ -d "/proc/$MYSQLPID" ] ; then
    	    MYSQLDRUNNING=1
    	fi
        fi
        RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
        if [ $MYSQLDRUNNING = 1 ] && [ $? = 0 ]; then
    	# already running, do nothing
    	action $"Starting $prog: " /bin/true
    	ret=0
        elif [ $MYSQLDRUNNING = 1 ] && echo "$RESPONSE" | grep -q "Access denied for user"
        then
    	# already running, do nothing
    	action $"Starting $prog: " /bin/true
    	ret=0
        else
        	# prepare for start
    	touch "$errlogfile" 2>/dev/null
    	if [ $? -ne 0 ]; then
    	     # failed to touch log file, probably insufficient permissions
    	    action $"Starting $prog: " /bin/false
    	    return 4
    	fi
    	chown mysql:mysql "$errlogfile" 
    	chmod 0640 "$errlogfile"
    	[ -x /sbin/restorecon ] && /sbin/restorecon "$errlogfile"
    	if [ ! -d "$datadir/mysql" ] ; then
    	    # First, make sure $datadir is there with correct permissions
    	    if [ ! -e "$datadir" -a ! -h "$datadir" ]
    	    then
    		mkdir -p "$datadir" || exit 1
    	    fi
    	    chown mysql:mysql "$datadir"
    	    chmod 0755 "$datadir"
    	    [ -x /sbin/restorecon ] && /sbin/restorecon "$datadir"
    	    # Now create the database
    	    action $"Initializing MySQL database: " /usr/bin/mysql_install_db --datadir="$datadir" --user=mysql
    	    ret=$?
    	    chown -R mysql:mysql "$datadir"
    	    if [ $ret -ne 0 ] ; then
    		return $ret
    	    fi
    	fi
    	chown mysql:mysql "$datadir"
    	chmod 0755 "$datadir"
    	# We check if there is already a process using the socket file,
    	# since otherwise this init script could report false positive
    	# result and mysqld_safe would remove the socket file, which
    	# actually uses a different daemon.
    	if fuser "$socketfile" &>/dev/null ; then
    	    echo "Socket file $socketfile exists. Is another MySQL daemon already running with the same unix socket?"
    	    action $"Starting $prog: " /bin/false
    	    return 1
    	fi
    	# Pass all the options determined above, to ensure consistent behavior.
    	# In many cases mysqld_safe would arrive at the same conclusions anyway
    	# but we need to be sure.  (An exception is that we don't force the
    	# log-error setting, since this script doesn't really depend on that,
    	# and some users might prefer to configure logging to syslog.)
    	# Note: set --basedir to prevent probes that might trigger SELinux
    	# alarms, per bug #547485
    	$exec   --datadir="$datadir" --socket="$socketfile" \
    		--pid-file="$mypidfile" \
    		--basedir=/usr --user=mysql >/dev/null 2>&1 &
    	safe_pid=$!
    	# Spin for a maximum of N seconds waiting for the server to come up;
    	# exit the loop immediately if mysqld_safe process disappears.
    	# Rather than assuming we know a valid username, accept an "access
    	# denied" response as meaning the server is functioning.
    	ret=0
    	TIMEOUT="$STARTTIMEOUT"
    	while [ $TIMEOUT -gt 0 ]; do
    	    RESPONSE=`/usr/bin/mysqladmin --socket="$socketfile" --user=UNKNOWN_MYSQL_USER ping 2>&1`
    	    mret=$?
    	    if [ $mret -eq 0 ]; then
    		break
    	    fi
    	    # exit codes 1, 11 (EXIT_CANNOT_CONNECT_TO_SERVICE) are expected,
    	    # anything else suggests a configuration error
    	    if [ $mret -ne 1 -a $mret -ne 11 ]; then
    		echo "$RESPONSE"
    		echo "Cannot check for MySQL Daemon startup because of mysqladmin failure."
    		ret=1
    		break
    	    fi
    	    echo "$RESPONSE" | grep -q "Access denied for user" && break
    	    if ! /bin/kill -0 $safe_pid 2>/dev/null; 
    #验证$safe_pid值对应的进程是否存在。	    
    then
    		echo "MySQL Daemon failed to start."
    		ret=1
    		break
    	    fi
    	    sleep 1
    	    let TIMEOUT=${TIMEOUT}-1
    	done
    	if [ $TIMEOUT -eq 0 ]; then
    	    echo "Timeout error occurred trying to start MySQL Daemon."
    	    ret=1
    	fi
    	if [ $ret -eq 0 ]; then
    	    action $"Starting $prog: " /bin/true
    	    chmod o+r $mypidfile >/dev/null 2>&1
    	    touch $lockfile
    	else
    	    action $"Starting $prog: " /bin/false
    	fi
        fi
        return $ret
    }
    
    stop(){
    	if [ ! -f "$mypidfile" ]; then
    	    # not running; per LSB standards this is "ok"
    	    action $"Stopping $prog: " /bin/true
    	    return 0
    	fi
    	MYSQLPID=`cat "$mypidfile" 2>/dev/null`
    	if [ -n "$MYSQLPID" ]; then
    	    /bin/kill "$MYSQLPID" >/dev/null 2>&1
    	    ret=$?
    	    if [ $ret -eq 0 ]; then
    		TIMEOUT="$STOPTIMEOUT"
    		while [ $TIMEOUT -gt 0 ]; do
    		    /bin/kill -0 "$MYSQLPID" >/dev/null 2>&1 || break
    		    sleep 1
    		    let TIMEOUT=${TIMEOUT}-1
    		done
    		if [ $TIMEOUT -eq 0 ]; then
    		    echo "Timeout error occurred trying to stop MySQL Daemon."
    		    ret=1
    		    action $"Stopping $prog: " /bin/false
    		else
    		    rm -f $lockfile
    		    rm -f "$socketfile"
    		    action $"Stopping $prog: " /bin/true
    		fi
    	    else
    		action $"Stopping $prog: " /bin/false
    	    fi
    	else
    	    # failed to read pidfile, probably insufficient permissions
    	    action $"Stopping $prog: " /bin/false
    	    ret=4
    	fi
    	return $ret
    }
     
    restart(){
        stop
        start
    }
    
    condrestart(){
        [ -e $lockfile ] && restart || :
    }
    
    
    # See how we were called.
    case "$1" in
      start)
        start
        ;;
      stop)
        stop
        ;;
      status)
        status -p "$mypidfile" $prog
        ;;
      restart)
        restart
        ;;
      condrestart|try-restart)
        condrestart
        ;;
      reload)
        exit 3
        ;;
      force-reload)
        restart
        ;;
      *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
        exit 2
    esac
    
    exit $?
    
    • 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
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185
    • 186
    • 187
    • 188
    • 189
    • 190
    • 191
    • 192
    • 193
    • 194
    • 195
    • 196
    • 197
    • 198
    • 199
    • 200
    • 201
    • 202
    • 203
    • 204
    • 205
    • 206
    • 207
    • 208
    • 209
    • 210
    • 211
    • 212
    • 213
    • 214
    • 215
    • 216
    • 217
    • 218
    • 219
    • 220
    • 221
    • 222
    • 223
    • 224
    • 225
    • 226
    • 227
    • 228
    • 229
    • 230
    • 231
    • 232
    • 233
    • 234
    • 235
    • 236
    • 237
    • 238
    • 239
    • 240
    • 241
    • 242
    • 243
    • 244
    • 245
    • 246
    • 247
    • 248
    • 249
    • 250
    • 251
    • 252
    • 253

    ​ 应用:大家如果想要写一个管理系统服务的脚本,则可以使用这个技巧。

  • 相关阅读:
    C#算法、排序以及数据结构
    【将文本编码为图像灰度级别】以 ASCII 编码并与灰度级别位混合将文本字符串隐藏到图像像素的最低位中,使其不明显研究(Matlab代码实现)
    55.【sort函数的升序降序】
    Pytest----通过设置重复路径可以重复执行多次
    【目标检测】Generalized Focal Loss V1
    域名讲解(一)域名基础概念
    猜数字游戏
    VueUse、View Transitions API实现暗黑模式主题动画切换效果
    SCHNOKA施努卡:为什么要使用表面缺陷检测系统呢?
    GCC内联汇编及其在Linux内核中的使用
  • 原文地址:https://blog.csdn.net/qq_25599925/article/details/126202425