killall cho tôi 'không tìm thấy quá trình nào' nhưng ps


17

Ai đó có thể giải thích cho tôi sự khác biệt giữa killkillall? Tại sao không killallthấy những gì pscho thấy?

# ps aux |grep db2
root      1123  0.0  0.8 841300 33956 pts/1    Sl   11:48   0:00 db2wdog                                         
db2inst1  1125  0.0  3.5 2879496 143616 pts/1  Sl   11:48   0:02 db2sysc                                        
root      1126  0.0  0.6 579156 27840 pts/1    S    11:48   0:00 db2ckpwd                                        
root      1127  0.0  0.6 579156 27828 pts/1    S    11:48   0:00 db2ckpwd                                        
root      1128  0.0  0.6 579156 27828 pts/1    S    11:48   0:00 db2ckpwd 

# killall db2ckpwd
db2ckpwd: no process found

# kill -9 1126
# kill -9 1127
# kill -9 1128

Hệ thống là SuSe 11.3 (64 bit); nhân 2.6.34-12; Procps phiên bản 3.2.8; killall từ PSmisc 22.7; giết từ lõi core GNU 7.1


Không bao giờ giết các tiến trình với SIGKILL (-9).
vonbrand

Phải làm gì sau đó khi một quá trình cần chấm dứt?
Radek

Đây là giải pháp cuối cùng.
vonbrand

Câu trả lời:


19

Đây có phải trên Linux không?

Thực tế, có một vài phiên bản tinh tế khác nhau của tên lệnh được sử dụng bởi ps, killallvv

Hai biến thể chính là: 1) tên lệnh dài, đó là những gì bạn nhận được khi chạy ps u; và 2) tên lệnh ngắn, đó là những gì bạn nhận được khi chạy psmà không có bất kỳ cờ nào.

Có lẽ sự khác biệt lớn nhất xảy ra nếu chương trình của bạn là tập lệnh shell hoặc bất cứ điều gì cần có trình thông dịch, ví dụ Python, Java, v.v.

Đây là một kịch bản thực sự tầm thường chứng minh sự khác biệt. Tôi gọi nó mycat:

#!/bin/sh
cat

Sau khi chạy nó, đây là hai loại khác nhau ps.

Thứ nhất, không có u:

$ ps -p 5290
  PID TTY      ... CMD
 5290 pts/6    ... mycat

Thứ hai, với u:

$ ps u 5290
USER       PID ... COMMAND
mikel     5290 ... /bin/sh /home/mikel/bin/mycat

Lưu ý làm thế nào phiên bản thứ hai bắt đầu với /bin/sh?

Bây giờ, theo như tôi có thể nói, killallthực sự đọc /proc/<pid>/statvà lấy từ thứ hai ở giữa các parens làm tên lệnh, vì vậy đó thực sự là những gì bạn cần chỉ định khi chạy killall. Về mặt logic, điều đó sẽ giống như những gì pskhông có ucờ nói, nhưng sẽ là một ý tưởng tốt để kiểm tra.

Những điều cần kiểm tra:

  1. những gì không cat /proc/<pid>/statnói tên lệnh là gì?
  2. những gì không ps -e | grep db2nói tên lệnh là gì?
  3. làm ps -e | grep db2ps au | grep db2hiển thị cùng tên lệnh?

Ghi chú

Nếu bạn cũng đang sử dụng các cờ ps khác, thì bạn có thể thấy đơn giản hơn khi sử dụng ps -o commđể xem tên ngắn và ps -o cmdđể xem tên dài.

Bạn cũng có thể tìm thấy pkillmột sự thay thế tốt hơn. Cụ thể, pkill -fcố gắng khớp bằng tên lệnh đầy đủ, tức là tên lệnh như được in bởi ps uhoặc ps -o cmd.


giải thích rất tốt. Và tôi đoán bạn đã đúng lần đầu tiên. ps -e |grep db2 gives me 3084? 00:00:00 db2syscr` và ps aux | grep db2 mang lại cho tôi root 3084 0.0 0.6 579292 28304 ? S 13:02 0:00 db2ckpwd. Có thể nhận xét về điều đó. Tôi hơi lạc lõng.
Radek

Tôi không chắc. Có thể chương trình đang thay đổi tên của nó. Bạn có biết làm thế nào nó được chạy? Nó ls -l /proc/3084/exenói gì Điều gì về whichhoặc whencehoặc typeđể tìm tệp và sau đó lstypeđể xem nếu đó là một liên kết tượng trưng hoặc tập lệnh hoặc nhị phân?
Mikel

ls -l / Proc / 3084 / exe mang đến cho chúng tôilrwxrwxrwx 1 root root 0 Jun 6 16:49 /proc/3084/exe -> /var/lib/db2/db2inst1/sqllib/adm/db2syscr
Radek

ls -l / var / lib / db2 / db2inst1 / sqllib / adm / db2syscr mang lại cho tôi-r-sr-s--- 1 root db2iadm1 147K Feb 1 23:32 /var/lib/db2/db2inst1/sqllib/adm/db2syscr*
Radek

loại cho tôi / var / lib / db2 / db2inst1 / sqllib / adm / db2syscr/var/lib/db2/db2inst1/sqllib/adm/db2syscr is /var/lib/db2/db2inst1/sqllib/adm/db2syscr
Radek

6

killall cố gắng khớp với tên quy trình (nhưng thực sự không tốt ở phần khớp).

Và vì "ps | grep" và "ps | grep | kill" thực hiện công việc tốt hơn nhiều, nên ai đó đã đơn giản hóa điều này và tạo ra pgrep và pkill. Đọc các lệnh như "ps grep" và "ps kill", vì lệnh đó trước tiên là ps sau đó là grep và nếu muốn giết.


2

Tôi đã có một vấn đề tương tự nhưng /proc/<pid>/statchứa chuỗi dự kiến. Bằng cách sử dụng strace tôi có thể thấy killall cũng được truy cập /proc/<pid>/cmdline.

Tôi tiếp tục điều tra bằng gdb để thấy rằng trong trường hợp của tôi, nó đã thất bại khi kiểm tra lệnh của tôi với lệnh đầy đủ bao gồm tất cả các đối số được tìm thấy trong /proc/<pid>/cmdline. Có vẻ như đường dẫn của mã được kích hoạt do tên tệp dài hơn 15 ký tự (là giá trị được mã hóa cứng trong nguồn killall). Tôi đã không điều tra đầy đủ nếu tôi bằng cách nào đó có thể khiến nó hoạt động với killall.

Nhưng như đã đề cập trong các bình luận khác ở đây, pkill là một sự thay thế tốt hơn mà không có vấn đề tương tự.

Mã nguồn của pkillcó thể được tìm thấy ở đây https://github.com/acg/psmisc cho những người quan tâm.


0

Trên các hệ thống Ubuntu 16, / Proc / pid / stat sẽ chứa tên của luồng (mà một chương trình có thể thông qua cuộc gọi hệ thống pthread_setname_np .

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.