如何优雅地杀死具有其名称的守护程序?


16

我通常用杀死进程killall

killall markdoc

但是我不确定此命令是否可以正常终止进程。此命令是否可以正常终止?如果不是,我该如何优雅地终止其名称的进程?


您的发行版中是否包含start-stop-daemon
manatwork 2012年

我正在使用Ubuntu 10.04 LTS服务器x64。那是什么守护进程?
Eonil'1

它是启动/停止守护程序以及管理相关信息(如pid文件)的通用工具。它存在于Ubuntu中,请参见其手册页
manatwork 2012年

Answers:


19

您的问题尚不清楚,您在标题中谈论的是守护进程,但在正文中仅谈论一般的过程。

对于守护程序,有特定的方法可以停止它,例如在Debian中

    service daemon-name stop

要么

    /etc/init.d/daemon-name stop

对于其他发行版/ OS中使用的其他初始化脚本标准,存在类似的语法。

要杀死一个非守护进程,假设它处于某种失控状态,您可以安全地使用killallor pkill,因为它们默认情况下使用SIGTERM(15)信号,并且任何编写得体的应用程序都应捕获并正常退出此接收信号。考虑到这些实用程序可能杀死一个进程,如果有多个同名。

如果那不起作用,则可以尝试SIGINT(2),然后尝试(SIGHUP1),并且作为最后的选择SIGKILL(9)。应用程序无法捕获到最后一个信号,因此它无法执行任何清理。因此,应尽可能避免使用它。

二者pkillkillall接受形式的信号参数-NAME,如在

pkill -INT process-name

谢谢。实际上,我最初的问题是关于markdoc serve &svnserve -d。我认为这是一种守护进程,但我
不确定

killall是杀手!
xdevs23 '16

3

在类似BSD的发行版上,您通常会在/etc/rc.d/中拥有脚本,这些脚本通常用于管理系统中启动,重新启动和停止守护程序。要停止守护程序,您可以使用绝对路径调用脚本,例如:

# /etc/rc.d/acpid stop

或使用命令:

# rc.d stop acpid

我强烈建议尝试使用以下脚本来显示系统启动和停止的守护程序:

#!/bin/bash

chk_status(){
  target=$1
  if [[ $target != "functions" && $target !=  "functions.d" ]]
  then
    if [[ -f "/var/run/daemons/$target" ]]
     then
       stat="\e[1;32m[RUNNING]"
     else
       stat="\e[1;31m[STOPPED]"
     fi

    printf "$stat \t\e[1;34m$target\e[0;0m\n"
  fi
}

daemons=($(for daemon in /etc/rc.d/*; do echo "${daemon#\/etc\/rc.d\/}"; done))

if [[ $1 != "" ]]
then
 chk_status $1
else
 for d in "${daemons[@]}"; do
   chk_status $d
 done | sort
fi

0

检查脚本中killproc可用的功能,获取/etc/init.d/functions文件并使用该功能。或使用pgreppkill实用程序检查它们是否按预期工作,然后再使用它们。示例: pkill -SIGTERM mysqld将发送TERM kill信号,以使mysqld执行安全关闭并在杀死之前将数据库刷新到磁盘上。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.