Bagaimana cara saya membunuh semua proses pengguna menggunakan UID mereka

41

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 ada di 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?

pengguna489152
sumber
6
Apakah Anda ingin alat untuk melakukan ini (pkill, membunuh, orang lain ada), atau Anda ingin menulis sendiri? Jika yang pertama, situs pertukaran tumpukan superuser mungkin lebih baik. Jika yang terakhir, pemindaian / pengadaan dan membuat catatan untuk semua proses oleh pengguna tertentu adalah cara untuk pergi. Kode sumber untuk utilitas pkill akan, misalnya, menunjukkan cara melakukannya.
Bisakah Anda mengklarifikasi apa pertanyaan ini sehubungan dengan komentar @ LarsWirzenius? Terima kasih!
Caleb
@ Caleb: Saya ingin membunuh proses dengan membaca / proc karena saya tidak tahu ada alat yang melakukannya. Juga sekarang saya menemukan bahwa selain "kill", "pkill", "skill" dll tidak tersedia di sistem saya. Dalam hal ini saya kira saya harus melihat alternatif skrip shell untuk membaca / proc dan mencari cara untuk mendapatkan proses di bawah satu pengguna. Ada ide?
user489152
1
Mengenai "daftar statis semua UID ... jadi saya dapat memvalidasi ini ada pengguna ini": tidak ada yang namanya memvalidasi ID pengguna. Nama pengguna berasal dari basis data, tetapi ID pengguna adalah apa pun yang dipilih oleh proses yang berjalan setuid().
Gilles 'SO- stop being evil'

Jawaban:

53

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

Skill adalah linux-spesifik 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 itu 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 lengkap proses (melakukan readdir /proc). Saya pikir, mereka akan beralih pada /procsubfolder digital dan memeriksa setiap proses yang ditemukan untuk kecocokan.

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

alat skill (procps & procps-ng) dan killall (psmisc) keduanya menggunakan getpwnampanggilan pustaka untuk menguraikan argumen -uopsi, dan hanya nama pengguna yang akan diuraikan. pkill(procps & procps-ng) menggunakan atol dan getpwnam untuk mem-parsing -u/ -Uberargumen dan memungkinkan specifier pengguna numerik dan tekstual.

osgx
sumber
1
pkill tidak usang. Ini mungkin tidak dapat dilakukan di luar Linux, tetapi pertanyaannya adalah tentang Linux secara khusus.
1
untuk mendapatkan daftar pengguna, gunakan one liner: getent passwd | awk -F: '{print $ 1}'
Petesh
bagaimana dengan saya memberikan perintah seperti: "kill -ju UID" dari panggilan sistem C ()?
1
apakah ini embedded linux? Anda tidak memiliki keterampilan, pkill dan killall? Bahkan busybox embedded shell memiliki pkill dan killall.
osgx
2
killall -u USERNAMEbekerja seperti pesona
michalzuber
8

Jika Anda melewatkan -1 sebagai argumen ID proses ke killperintah shell atau killfungsi C , maka sinyal dikirim ke semua proses yang dapat dijangkau, yang dalam praktiknya berarti semua proses pengguna yang menjalankan killperintah atau syscall.

su -c 'kill -TERM -1' bob

Di C (pemeriksaan kesalahan dihilangkan):

if (fork() == 0) {
    setuid(uid);
    signal(SIGTERM, SIG_DFL);
    kill(-1, SIGTERM);
}
Gilles 'SANGAT berhenti menjadi jahat'
sumber
5

Jika fungsi pkill tidak tersedia di distribusi UNIX / Linux Anda, Anda dapat 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

Komunitas
sumber
atau hanya pkill -U username.
osgx
2
pgrep -U username|xargs kill -9
Alexander
sumber
0

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
jasonrhaas
sumber