it-swarm-id.com

Bagaimana cara saya membunuh semua proses pengguna menggunakan UID mereka

Saya ingin membunuh semua proses yang berjalan dari pengguna tertentu baik dari skrip Shell atau kode asli pada sistem Linux.

Apakah saya harus membaca direktori/proc dan mencari ini?

Ada ide? Apakah ada pemetaan dinamis dari pid di bawah UID di Linux? Bukankah ini di dalam proc?

Jika tidak, lalu di mana daftar ini disimpan? Haruskah saya membacanya? Juga di mana daftar statis semua UID dalam sistem sehingga saya dapat memvalidasi pengguna ini ada dan kemudian melanjutkan untuk membunuh semua proses yang berjalan di bawahnya?

45
user489152

Gunakan pkill -U UID atau pkill -u UID atau nama pengguna alih-alih UID. Terkadang skill -u USERNAME dapat bekerja, alat lain adalah killall -u USERNAME .

Skill adalah linux-specific dan sekarang sudah ketinggalan zaman, dan pkill lebih portabel (Linux, Solaris, BSD).

pkill memungkinkan UID angka dan simbol, efektif dan nyata http://man7.org/linux/man-pages/man1/pkill.1.html

pkill - ... proses sinyal berdasarkan nama dan atribut lainnya

    -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.

Halaman manual skill mengatakan apakah diizinkan hanya menggunakan nama pengguna, bukan id pengguna: http://man7.org/linux/man-pages/man1/skill.1.html

skill, snice ... Alat-alat ini sudah usang dan tidak dapat diport. Sintaks perintah tidak didefinisikan dengan baik. Pertimbangkan untuk menggunakan killall, pkill

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

killall tidak ditandai sebagai usang di Linux, tetapi juga tidak akan bekerja dengan UID angka; hanya nama pengguna: http://man7.org/linux/man-pages/man1/killall.1.html

killall - kill proses dengan nama

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

Saya pikir, utilitas apa pun yang digunakan untuk menemukan proses dalam Linux/Solaris style/proc (procfs) akan menggunakan daftar proses yang lengkap (melakukan beberapa readdir dari /proc). Saya pikir, mereka akan mengulangi /proc subfolder digital dan periksa setiap proses yang ditemukan untuk kecocokan.

Untuk mendapatkan daftar pengguna, gunakan getpwent (itu akan mendapatkan satu pengguna per panggilan).

skill (procps & procps-ng) dan killall (psmisc) alat keduanya menggunakan getpwnam panggilan perpustakaan ke argumen parsing dari -u pilihan, dan hanya nama pengguna yang akan diuraikan. pkill (procps & procps-ng) menggunakan atol dan getpwnam untuk menguraikan -u/-U argumen dan izinkan specifier pengguna numerik dan tekstual.

60
osgx

Jika Anda melewatkan -1 sebagai argumen ID proses ke kill perintah Shell atau kill C fungsi , maka sinyalnya adalah dikirim ke semua proses yang dapat dijangkau, yang dalam praktiknya berarti semua proses pengguna yang menjalankan perintah atau syscall kill.

su -c 'kill -TERM -1' bob

Di C (pemeriksaan kesalahan dihilangkan):

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

Jika fungsi pkill tidak tersedia di distribusi UNIX/Linux Anda, Anda bisa menjalankan perintah berikut sebagai pengguna root:

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

di mana nama pengguna adalah pengguna yang memproses yang ingin Anda hapus

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

Ini bekerja dengan baik untuk saya. Anda dapat menemukan semua pid dari proses dengan nama pengguna dengan melakukan ps U <username> dan pergi dari sana. Coba ini:

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