Làm cách nào để giết tất cả các quy trình của người dùng bằng UID của họ


41

Tôi muốn giết tất cả các quy trình đang chạy của một người dùng cụ thể từ tập lệnh shell hoặc mã gốc trên hệ thống Linux.

Tôi có phải đọc thư mục / Proc và tìm những thư mục này không?

Có ý kiến ​​gì không? Có một bản đồ động của các pids theo UID trong Linux không? Đây không phải là trong Proc?

Nếu không thì danh sách này được duy trì ở đâu? Tôi có nên đọc từ nó? Ngoài ra đâu là danh sách tĩnh của tất cả các UID trong hệ thống để tôi có thể xác thực người dùng này tồn tại và sau đó tiến hành tiêu diệt tất cả các quy trình đang chạy trong nó?


6
Bạn có muốn một công cụ để làm điều này (pkill, slay, những người khác tồn tại), hoặc bạn muốn tự viết nó? Nếu trước đây, trang web trao đổi ngăn xếp siêu người dùng có lẽ là tốt hơn. Nếu sau này, quét / Proc và ghi chú cho tất cả các quy trình bởi một người dùng cụ thể là cách để đi. Ví dụ, mã nguồn cho tiện ích pkill sẽ chỉ ra cách thực hiện điều đó.

Bạn có thể làm rõ câu hỏi này là gì về nhận xét của @ LarsWirzenius không? Cảm ơn!
Caleb

@Caleb: Tôi muốn giết các tiến trình bằng cách đọc / Proc vì tôi không biết bất kỳ công cụ nào thực hiện nó. Ngoài ra bây giờ tôi thấy rằng khác với "giết", "pkill", "kỹ năng", vv không có sẵn trên hệ thống của tôi. Trong trường hợp đó, tôi đoán rằng tôi phải xem xét các lựa chọn thay thế tập lệnh shell để đọc / Proc và tìm ra cách để có được các quy trình dưới một người dùng. Có ý kiến ​​gì không?
dùng.4892

1
Liên quan đến danh sách tĩnh của tất cả các UIDs vì vậy tôi có thể xác thực người dùng này tồn tại trên mạng: không có gì gọi là xác thực ID người dùng. Tên người dùng đến từ cơ sở dữ liệu, nhưng ID người dùng là bất cứ quy trình nào đang chạy setuid().
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


52

Sử dụng pkill -U UIDhoặc pkill -u UIDhoặc tên người dùng thay vì UID. Đôi khi skill -u USERNAMEcó thể làm việc, một công cụ khác là killall -u USERNAME.

Skill là một công cụ dành riêng cho linux và hiện đã lỗi thời và pkill dễ mang theo hơn (Linux, Solaris, BSD).

pkill cho phép cả UID số và tượng trưng, ​​hiệu quả và thực tế http://man7.org/linux/man-pages/man1/pkill.1.html

pkill - ... các quá trình tín hiệu dựa trên tên và các thuộc tính khác

    -u, --euid euid,...
         Only match processes whose effective user ID is listed.
         Either the numerical or symbolical value may be used.
    -U, --uid uid,...
         Only match processes whose real user ID is listed.  Either the
         numerical or symbolical value may be used.

Trang kỹ năng nói rằng nó chỉ được phép sử dụng tên người dùng, không phải id người dùng: http://man7.org/linux/man-pages/man1/skill.1.html

kỹ năng, snice ... Những công cụ này đã lỗi thời và không thể truy cập được. Cú pháp lệnh được xác định kém. Cân nhắc sử dụng killall, pkill

  -u, --user user
         The next expression is a username.

killall không được đánh dấu là lỗi thời trong Linux, nhưng nó cũng sẽ không hoạt động với UID số; tên người dùng duy nhất: http://man7.org/linux/man-pages/man1/killall.1.html

killall - giết quy trình theo tên

   -u, --user
         Kill only processes the specified user owns.  Command names
         are optional.

Tôi nghĩ rằng, bất kỳ tiện ích nào được sử dụng để tìm quy trình theo kiểu Linux / Solaris / Proc (Procfs) sẽ sử dụng danh sách đầy đủ các quy trình (thực hiện một số thao tác lại /proc). Tôi nghĩ rằng, họ sẽ lặp lại trên /proccác thư mục con kỹ thuật số và kiểm tra mọi quy trình tìm thấy cho phù hợp.

Để có danh sách người dùng, hãy sử dụng getpwent(nó sẽ nhận được một người dùng cho mỗi cuộc gọi).

cả hai công cụ skill (Procps & Procps-ng) và killall (psmisc) đều sử dụng getpwnamlệnh gọi thư viện để phân tích đối số -utùy chọn và chỉ tên người dùng sẽ được phân tích cú pháp. pkill(Procps & Procps-ng) sử dụng cả atol và getpwnam để phân tích -u/ -Uđối số và cho phép cả trình xác định người dùng số và văn bản.


1
pkill không lỗi thời. Nó có thể không thể truy cập được bên ngoài Linux, nhưng câu hỏi là về Linux cụ thể.

1
để có được danh sách người dùng sử dụng một lớp lót: getent passwd | awk -F: '{in $ 1}'
Petesh

Điều gì về tôi đưa ra một lệnh như: "kill -ju UID" từ lệnh gọi C system ()?

1
nó có phải là một linux nhúng không? bạn không có kỹ năng, pkill và killall? Ngay cả vỏ nhúng busybox cũng có pkill và killall.
osgx

2
killall -u USERNAMElàm việc như bùa mê
michalzuber

8

Nếu bạn chuyển -1 làm đối số ID tiến trình cho killlệnh shell hoặc killhàm C , thì tín hiệu được gửi đến tất cả các quy trình mà nó có thể đạt tới, trong thực tế có nghĩa là tất cả các quy trình của người dùng đang chạy killlệnh hoặc tòa nhà .

su -c 'kill -TERM -1' bob

Trong C (kiểm tra lỗi bỏ qua):

if (fork() == 0) {
    setuid(uid);
    signal(SIGTERM, SIG_DFL);
    kill(-1, SIGTERM);
}

5

Nếu chức năng pkill không khả dụng trên bản phân phối UNIX / Linux của bạn, bạn có thể chạy lệnh sau với tư cách là người dùng root:

ps -ef | grep username | grep -v grep | awk '{print $2}' | xargs kill

Tên người dùng là người dùng mà bạn muốn xóa


hay chỉ là pkill -U username.
osgx


0

Điều này đã làm việc tốt cho tôi. Bạn có thể tìm thấy tất cả các quy trình theo tên người dùng bằng cách thực hiện ps U <username>và đi từ đó. Thử đi:

ps U <username> | cut -d " " -f 1 | xargs kill
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.