GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara mengubah semua utas (dan anak-anak) dari satu proses di Linux?

Anda dapat menggunakan /proc/$PID/task untuk menemukan semua utas dari proses tertentu, oleh karena itu Anda dapat menggunakan

$ ls /proc/$PID/task | xargs renice $PRIO

ke renice semua utas milik proses tertentu.

Cara yang sama /proc/$PID/task/$PID/children dapat digunakan untuk menemukan semua proses turunan (atau /proc/$PID/task/*/children jika Anda ingin semua proses anak dari semua utas dari proses tertentu).

$ cat /proc/$PID/task/$PID/children | xargs renice $PRIO
$ cat /proc/$PID/task/*/children | xargs renice $PRIO

Menemukan semua PID untuk renice secara rekursif

Kita perlu mendapatkan PID dari semua proses ("normal" atau "utas") yang merupakan keturunan (anak-anak atau dalam grup utas) dari proses yang akan diperbaiki. Ini harus bersifat rekursif (mengingat anak-anak dari anak-anak).

Anton Leontiev jawaban memberikan petunjuk untuk melakukannya:semua nama folder di /proc/$PID/task/ adalah PID utas yang berisi children daftar file proses anak potensial.

Namun, tidak memiliki rekursif, jadi inilah skrip shell cepat &kotor untuk menemukannya:

#!/bin/sh
[ "$#" -eq 1 -a -d "/proc/$1/task" ] || exit 1

PID_LIST=
findpids() {
        for pid in /proc/$1/task/* ; do
                pid="$(basename "$pid")"
                PID_LIST="$PID_LIST$pid "
                for cpid in $(cat /proc/$1/task/$pid/children) ; do
                        findpids $cpid
                done
        done
}

findpids $1
echo $PID_LIST

Jika proses PID 1234 adalah proses yang Anda inginkan secara rekursif, sekarang Anda dapat melakukannya:

renice -n 15 -p $(/path/to/findchildren.sh 1234)

Catatan tambahan

Nilai bagus atau pembagian CPU ?

Harap perhatikan bahwa saat ini, nilai bagus mungkin tidak terlalu relevan "di seluruh sistem", karena pengelompokan tugas otomatis, terutama saat menggunakan systemd . Silakan lihat jawaban ini untuk detail lebih lanjut.

Perbedaan antara utas dan proses

Catatan:jawaban ini menjelaskan utas Linux dengan tepat.

Singkatnya:kernel hanya menangani "entitas yang dapat dijalankan", yaitu sesuatu yang dapat dijalankan dan dijadwalkan . Dari segi kernel, entitas ini disebut proses. Utas, hanyalah sejenis proses yang berbagi (setidaknya) ruang memori dan penangan sinyal dengan yang lain. Setiap proses tersebut memiliki pengidentifikasi unik di seluruh sistem:PID (Process ID).

Hasilnya, Anda bisa renice setiap "utas" secara individual karena mereka memiliki milik mereka PID.

Lihat jawaban ini untuk informasi selengkapnya tentang PID (ProcessID) dan perbedaan TID (ThreadID).


Kita tidak boleh bingung antara PID proses dan id utas yang kadang ditulis TID atau dalam perintah ps LPW. s perintah memiliki opsi untuk menampilkan utas, dan di bawah top atau htop Anda beralih di antara utas dan memproses dengan H surat. Seperti yang diceritakan sebelumnya oleh @Totor, dengan NPTL, yang merupakan implementasi saat ini dengan kernel> 2.6, semua thread memiliki pid yang sama, tetapi memiliki tid yang berbeda. Anda menampilkan semua rangkaian proses dengan:

$ ps -Ljf <pid>

Tid ini adalah nama direktori di bawah /proc/<pid>/task , dan bahkan jika renice(1) mengatakan bahwa argumen defaultnya adalah pid ketika diterapkan ke pid yang hanya mengubah utas utama (ini adalah bug dalam implementasi linux seperti yang tertulis di setpriority(2) ), itu juga dapat diterapkan pada pasang surut dan memperbaiki utas. Itu sebabnya jawaban @Anton valid.

Tetapi paling sering ada cara yang lebih mudah untuk mencapai hasil yang diinginkan, semua utas ini memiliki pgid yang sama yang merupakan pid dari pemimpin grup; Anda dapat membatalkan dengan pgid dengan menerbitkan:

$ renice -g <pgid>

Jika Anda tidak ingin membatalkan beberapa proses lain yang bergantung pada pemimpin grup yang sama, Anda harus menggunakan resep @Anton:

$ renice <priority> $(ls -1 /proc/<pid>/task)

atau:

$renice <priority> $(ps --no-header -Lo tid <pid>)

Anda mungkin juga ingin tahu apa saja proses lain dari grup yang sama selain proses yang ingin Anda batalkan, yaitu proses yang berbagi pgid yang sama. Anda dapat menggunakan ps(1) , ps tidak memungkinkan untuk memilih proses oleh pemimpin grup, tetapi Anda dapat mengambil ps untuk melakukannya. Proses dengan pgid 1908 akan diberikan oleh perintah:

$ ps --no-header axo pid,pgid |sed -n '/^ *[0-9][0-9]*  *1908/s/[0-9][0-9]* *$//p'

atau jika Anda lebih suka awk daripada sed:

$ ps --no-header axo pid,pgid|awk '{if ($2=="1908") print $1;}'

Linux
  1. Cara Menemukan dan Membunuh Proses Zombie di Linux

  2. Linux – Bagaimana Membatasi Proses Ke Satu Cpu Core Di Linux??

  3. Renice:Bagaimana cara mengubah semua utas?

  1. Cara Memulai Perintah Linux di Latar Belakang dan Melepaskan Proses di Terminal

  2. Cara Mengatur Prioritas Proses Linux Menggunakan Perintah Nice dan renice

  3. Cara Menginstal dan Mengonfigurasi Monit di Linux untuk Pemantauan Proses

  1. Cara Mengubah Prioritas Proses menggunakan Linux Contoh Nice dan Renice

  2. Bagaimana cara mengganti nama semua folder dan file menjadi huruf kecil di Linux?

  3. Cara mengatur ID proses di Linux untuk program tertentu