it-swarm-vi.com

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ọ

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ó?

45
user489152

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

Skill là một phần mềm dành riêng cho linux và hiện đã lỗi thời và pkill có tính di động cao 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 cho biết 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ố readdir của /proc). Tôi nghĩ rằng, họ sẽ lặp đi lặp lại /proc 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).

skill (Procps & Procps-ng) và killall (psmisc) cả hai đều sử dụng getpwnam thư viện gọi để phân tích đối số của -u tù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ả chỉ định người dùng số và văn bản.

60
osgx

Nếu bạn chuyển -1 làm đối số ID tiến trình cho kill Lệnh Shell hoặc kill Hàm C , thì tín hiệu là đượ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 lệnh kill hoặc syscall.

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);
}

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

5
David
pgrep -U username|xargs kill -9
1
Alexander

Đ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ử cái này:

ps U <username> | cut -d " " -f 1 | xargs kill
0
jasonrhaas