Kullanıcı kimliklerini kullanıcı kimliklerini kullanarak nasıl öldürebilirim


41

Belirli bir kullanıcının tüm çalışan işlemlerini Linux sistemindeki bir kabuk komut dosyasından veya yerel koddan öldürmek istiyorum.

/ Proc dizinini okumak ve bunları aramak zorunda mıyım?

Herhangi bir fikir? Linux'ta UID'lerin altındaki çağrıların dinamik bir eşlemesi var mı? Bu işlemde değil mi?

Eğer değilse, o zaman bu liste nerede tutulur? Ondan okumalı mıyım? Ayrıca sistemdeki tüm UID'lerin statik listesi nerede, bu kullanıcının var olduğunu doğrulayabilirim ve altında çalışan tüm işlemleri öldürmeye devam edebilirim?


6
Bunu yapmak için bir araç mı istiyorsunuz (pkill, slay, diğerleri var) veya kendiniz yazmak mı istiyorsunuz? Eski ise, superuser yığın değişim sitesi muhtemelen daha iyidir. İkincisi, tarama / işlem yapma ve belirli bir kullanıcı tarafından tüm işlemler için not alma işlemi yapılması gereken yoldur. Örneğin, pkill yardımcı programının kaynak kodu nasıl yapıldığını gösterir.

@ LarsWirzenius'un yorumu ile bu sorunun neyle ilgili olduğunu açıklayabilir misiniz? Teşekkürler!
Caleb

@Caleb: Yaptığı herhangi bir aracı bilmediğim için / proc dosyasını okuyarak işlemleri öldürmek istedim. Ayrıca şimdi sistemimde "öldür", "pkill", "beceri" vb. Bu durumda / proc'u okumak ve bir kullanıcının altında işlem yapmanın bir yolunu bulmak için kabuk betiği alternatiflerine bakmak zorundayım. Herhangi bir fikir?
user489152

1
“Tüm UID'lerin statik listesi… ile ilgili olarak bu kullanıcının var olduğunu doğrulayabilirim” ile ilgili olarak: bir kullanıcı kimliğini doğrulamak gibi bir şey yoktur. Kullanıcı adları bir veritabanından gelir, ancak kullanıcı kimlikleri çalışan bir işlem setuid()seçtiği her ne ise .
Gilles 'SO- kötülük' dur

Yanıtlar:


52

Kullanım pkill -U UIDveya pkill -u UIDveya yerine UID kullanıcı adı. Bazen skill -u USERNAMEişe yarayabilir, başka bir araçtır killall -u USERNAME.

Beceri linux'a özgü ve şimdi modası geçmiş ve pkill daha taşınabilir (Linux, Solaris, BSD).

pkill hem sayısal hem de sembolik UID'lere, etkili ve gerçek izin verir http://man7.org/linux/man-pages/man1/pkill.1.html

pkill - ... isim ve diğer özelliklere dayalı sinyal işlemleri

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

Yetenekli sayfanın kullanıcı kimliğini değil, sadece kullanıcı adını kullanabileceğini söylüyor: http://man7.org/linux/man-pages/man1/skill.1.html

beceri, snice ... Bu araçlar eski ve taşınabilir değildir. Komut sözdizimi yetersiz tanımlanmış. Killall, pkill kullanmayı düşünün

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

killall Linux'ta modası geçmiş olarak işaretlenmedi, ancak aynı zamanda sayısal UID ile çalışmayacak; sadece kullanıcı adı: http://man7.org/linux/man-pages/man1/killall.1.html

killall - ada göre işlemleri öldür

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

Sanırım, Linux / Solaris stilinde / proc'te (procfs) bir işlem bulmak için kullanılan herhangi bir yardımcı program tam bir işlem listesi kullanacak (bazı okumalar yapacaktır /proc). /procDijital alt klasörler üzerinde yineleneceklerini ve bulunan tüm işlemleri eşleşmeleri için kontrol edeceklerini düşünüyorum .

Kullanıcıların listesini almak için kullanın getpwent(çağrı başına bir kullanıcı alacak).

skill (procps & procps-ng) ve killall (psmisc) araçlarının her ikisi de getpwnam, -useçenek argümanını çözümlemek için kütüphane çağrısı kullanır ve yalnızca kullanıcı adı ayrıştırılır. pkill(procps & procps-ng) , hem sayısal hem de metinsel kullanıcı belirleyicisini ayrıştırmak -u/ -Uargümanlaştırmak ve izin vermek için hem atol hem de getpwnam kullanır .


1
pkill eski değil. Linux dışında desteklenmeyebilir, ancak soru özellikle Linux ile ilgiliydi.

1
kullanıcıların listesini almak için bir liner kullanın: getent passwd | awk -F: '{print $ 1}'
Petesh

C system () çağrısından "kill -ju UID" gibi bir komut vermem ne olur?

1
gömülü bir linux mu? Yeteneğin yok, pkill ve katil mi? Meşgul kutu gömülü kabuğunda bile pkill ve katil vardır.
osgx

2
killall -u USERNAMEçekicilik gibi çalıştı
michalzuber

8

İşlem kimliği argümanı olarak -1 değerini killkabuk komutuna veya killC işlevine iletirseniz, sinyal erişebileceği tüm işlemlere gönderilir; bu, uygulamada killkomutu çalıştıran tüm kullanıcıları veya sistem çağrısı anlamına gelir .

su -c 'kill -TERM -1' bob

C (hata kontrolü atlandı):

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

5

Pkill işlevi UNIX / Linux dağıtımınızda kullanılamıyorsa, aşağıdaki komutu root kullanıcı olarak çalıştırabilirsiniz:

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

burada kullanıcı adı, işlemlerini silmek istediğiniz kullanıcının


ya da sadece pkill -U username.
osgx


0

Bu benim için iyi çalıştı. İşlemlerin tüm ücretlerini kullanıcı adına göre ps U <username>oradan gidip bularak bulabilirsiniz . Bunu dene:

ps U <username> | cut -d " " -f 1 | xargs kill
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.