it-swarm-tr.com

Bir kullanıcının UID'sini kullanarak tüm işlemleri nasıl öldürürüm

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

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

Herhangi bir fikir? Linux'taki UID'ler altındaki pidelerin dinamik bir eşlemesi var mı? Bu süreçte değil mi?

Değilse, bu liste nerede tutulur? Ondan okumalıyım? Ayrıca bu kullanıcı varlığını doğrulamak ve daha sonra altında çalışan tüm işlemleri öldürmeye devam böylece sistemdeki tüm UID statik listesi nerede?

45
user489152

UID yerine pkill -U UID veya pkill -u UID veya kullanıcı adı kullanın. Bazen skill -u USERNAME işe yarayabilir, başka bir araç killall -u USERNAME .

Beceri linux'a özgüdür ve artık güncel değildir 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 - ... isme ve diğer özelliklere dayalı sinyal süreçleri

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

Becerinin man sayfası, kullanıcı kimliğini değil, yalnızca kullanıcı adını kullanmasına izin verildiğini söylüyor: http://man7.org/linux/man-pages/man1/skill.1.html

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

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

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

killall - isimleri öldür

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

Bence, Linux/Solaris style/proc (procfs) içinde işlemi bulmak için kullanılan herhangi bir yardımcı program, işlemlerin tam listesini kullanacaktır (/proc 'un bazı readdir'lerini yapıyor). Sanırım, /proc dijital alt klasörler üzerinde yinelenecek ve bulunan her işlemi eşleşme için kontrol edecekler.

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

beceri (procps & procps-ng) ve killall (psmisc) araçları her ikisi de -u seçeneğinin argümanını ayrıştırmak için getpwnam kütüphane çağrısı kullanır ve yalnızca kullanıcı adı ayrıştırılır. pkill (procps & procps-ng) -u/-U bağımsız değişkeni ve hem sayısal hem de metinsel kullanıcı belirticisine izin ver.

İşlem kimliği bağımsız değişkeni olarak kill Shell komut veya kill C işlevi değerine -1 iletirseniz, sinyal erişebildiği tüm süreçlere gönderilir, bu da pratikte kullanıcının kill komutunu veya syscall komutunu çalıştıran tüm süreçleri anlamına gelir.

su -c 'kill -TERM -1' bob

C olarak (hata kontrolü atlandı):

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

UNIX/Linux dağıtımınızda pkill işlevi kullanılamıyorsa, kök kullanıcı olarak aşağıdaki komutu ç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ıdır

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

Bu benim için iyi çalıştı. İşlemlerin tüm pidlerini ps U <username> ve oradan gidin. Bunu dene:

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