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;}'