Làm thế nào để giết một daemon với tên của nó một cách duyên dáng?


16

Tôi thường giết một quá trình với killall.

killall markdoc

Nhưng tôi không chắc nếu lệnh này kết thúc quá trình một cách duyên dáng. Liệu lệnh này đạt được chấm dứt duyên dáng? Nếu không, làm thế nào tôi có thể giết một quá trình với tên của nó một cách duyên dáng?


Phân phối của bạn có start-stop-daemon không?
thao tác

Tôi đang sử dụng máy chủ Ubuntu 10.04 LTS x64 . Daemon đó là gì?
Eonil

Nó là một công cụ chung để bắt đầu / dừng trình nền và quản lý thông tin liên quan, như các tệp pid. Nó có mặt trong Ubuntu, xem trang người đàn ông của nó .
thao tác

Câu trả lời:


19

Câu hỏi của bạn không rõ ràng, bạn nói về một daemon trong tiêu đề, nhưng trong cơ thể chỉ nói về một quá trình chung.

Đối với một daemon, có các phương tiện cụ thể để ngăn chặn nó, ví dụ như trong Debian bạn có

    service daemon-name stop

hoặc là

    /etc/init.d/daemon-name stop

Các cú pháp tương tự tồn tại cho các tiêu chuẩn initscript khác được sử dụng trong các bản phân phối / HĐH khác.

Để tiêu diệt một quá trình không phải daemon, giả sử nó nằm ngoài tầm kiểm soát, bạn có thể sử dụng một cách an toàn killallhoặc pkill, mặc định rằng chúng sử dụng SIGTERMtín hiệu (15) theo mặc định , và bất kỳ ứng dụng bằng văn bản nào cũng nên nắm bắt và thoát ra một cách duyên dáng khi nhận được tín hiệu này . Hãy xem xét rằng các tiện ích này có thể giết chết nhiều hơn một quy trình, nếu có nhiều tiện ích có cùng tên.

Nếu điều đó không hiệu quả, bạn có thể thử SIGINT(2), sau đó SIGHUP(1) và như là phương sách cuối cùng SIGKILL(9). Tín hiệu cuối cùng này không thể được bắt bởi ứng dụng, do đó nó không thể thực hiện bất kỳ việc dọn dẹp nào. Vì lý do này, nó nên được tránh mỗi khi bạn có thể.

Cả hai pkillkillallchấp nhận một tham số tín hiệu ở dạng -NAME, như trong

pkill -INT process-name

Cảm ơn bạn. Trên thực tế câu hỏi ban đầu của tôi là về markdoc serve &svnserve -d. Tôi nghĩ đó là một loại daemon, nhưng không có gì chắc chắn với tôi :)
Eonil

killalllà kẻ giết người!
xdevs23

3

Trên các bản phân phối giống như BSD và các bản phân phối khác, bạn sẽ thường có các tập lệnh trong /etc/rc.d/ thường quản lý việc bắt đầu, khởi động lại và dừng trình nền trong hệ thống của bạn. Để dừng một daemon, bạn có thể gọi các tập lệnh với đường dẫn tuyệt đối, ví dụ:

# /etc/rc.d/acpid stop

hoặc sử dụng lệnh:

# rc.d stop acpid

Tôi đặc biệt khuyên bạn nên dùng thử tập lệnh này để hiển thị các hệ thống của bạn đã khởi động và dừng trình nền:

#!/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

Kiểm tra killprocchức năng có sẵn trong /etc/init.d/functionstập lệnh, nguồn tệp và sử dụng chức năng. Hoặc sử dụng pgreppkillcác tiện ích để kiểm tra xem họ đang làm việc có chủ đích và sau đó sử dụng chúng. Ví dụ: pkill -SIGTERM mysqldsẽ gửi tín hiệu tiêu diệt TERM để mysqld thực hiện tắt máy an toàn và xả cơ sở dữ liệu vào đĩa trước khi bị giết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.