Come rinominare un gruppo di processi?


5

lb buildpuò costruire un'immagine di sistema dal vivo e invoca molti processi durante la creazione dell'immagine. Se lo avvio come di seguito:

# nice -n 19 ionice -n 7 -c 3 lb build

tutti i processi per bambini ottengono lo stesso buon livello:

  PID USER       IORR  IOWR    IO IO PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command                                                 
26196 morfik        0     0     0 B4  20   0 23888   672   668 S  0.0  0.1  0:00.24 │  ├─ -bash
30926 root          0     0     0 B4  20   0 53668   536   536 S  0.0  0.1  0:00.02 │  │  └─ su -
31008 root          0     0     0 B4  20   0 34656  6260  1144 S  0.0  0.6  0:02.60 │  │     └─ -su
11784 root          0     0     0 ??  39  19  4496   796   524 S  0.0  0.1  0:00.01 │  │        └─ /bin/sh /usr/lib/live/build/build               
11797 root          0     0     0 ??  39  19  4328   612   512 S  0.0  0.1  0:00.00 │  │           └─ /bin/sh ./auto/build
11806 root          0     0     0 ??  39  19  7028   604   504 S  0.0  0.1  0:00.00 │  │              ├─ tee build.log
11798 root          0     0     0 ??  39  19  4496   824   532 S  0.0  0.1  0:00.01 │  │              └─ /bin/sh /usr/lib/live/build/build noauto  
11915 root          0     0     0 ??  39  19  4496   836   544 S  0.0  0.1  0:00.01 │  │                 └─ /bin/sh /usr/lib/live/build/bootstrap  
12753 root          0     0     0 ??  39  19  4496   856   548 S  0.0  0.1  0:00.02 │  │                    └─ /bin/sh /usr/lib/live/build/bootstra
12867 root          0     0     0 ??  39  19 62980  3508  2132 S 11.2  0.3  0:07.00 │  │                       └─ aptitude --assume-yes update
12943 root          0     0     0 ??  39  19 24296  1916  1568 S  0.0  0.2  0:00.14 │  │                          ├─ /usr/lib/apt/methods/xz
12927 root          0     0     0 ??  39  19 53280 30688 30172 R 86.5  3.0  0:28.65 │  │                          ├─ /usr/lib/apt/methods/rred
12891 root          0     0     0 ??  39  19 24304  1784  1440 S  0.0  0.2  0:00.00 │  │                          ├─ /usr/lib/apt/methods/gpgv
12889 root          0     0     0 ??  39  19 24292  1624  1384 S  0.0  0.2  0:00.00 │  │                          ├─ /usr/lib/apt/methods/copy
12887 root          0     0     0 ??  39  19 32860  1956  1560 S  0.0  0.2  0:00.17 │  │                          ├─ /usr/lib/apt/methods/http
12886 root          0     0     0 ??  39  19 24292  1696  1444 S  0.0  0.2  0:00.00 │  │                          └─ /usr/lib/apt/methods/fil

Ma ho dimenticato di aggiungere questo nice -n 19 ionice -n 7 -c 3e ho funzionato giusto lb build. Quindi, ho provato al reniceprocesso genitore:

# renice -n 19 -p 6187

Ma questo non rinnega gli altri processi. Quindi, sembra così:

26196 morfik        0     0     0 B4  20   0 23888   668   664 S  0.0  0.1  0:00.24 │  ├─ -bash
30926 root          0     0     0 B4  20   0 53668   528   528 S  0.0  0.1  0:00.02 │  │  └─ su -
31008 root          0     0     0 B4  20   0 34656  5952  1224 S  0.0  0.6  0:02.62 │  │     └─ -su
 6187 root          0     0     0 B7  39  19  4496   800   524 S  0.0  0.1  0:00.00 │  │        └─ /bin/sh /usr/lib/live/build/build
 6349 root          0     0     0 B4  20   0  4328   612   512 S  0.0  0.1  0:00.00 │  │           └─ /bin/sh ./auto/build
 6351 root          0     0     0 B4  20   0  7028   592   488 S  0.0  0.1  0:00.00 │  │              ├─ tee build.log
 6350 root          0     0     0 B4  20   0  4496   828   532 S  0.0  0.1  0:00.01 │  │              └─ /bin/sh /usr/lib/live/build/build noauto  
 6445 root          0     0     0 B4  20   0  4496   840   548 S  0.0  0.1  0:00.00 │  │                 └─ /bin/sh /usr/lib/live/build/bootstrap  
 7580 root          0     0     0 B4  20   0  4496   856   552 S  0.0  0.1  0:00.02 │  │                    └─ /bin/sh /usr/lib/live/build/bootstra
 7692 root          0     0     0 B4  20   0 62924  5236  3848 S 15.5  0.5  0:03.78 │  │                       └─ aptitude --assume-yes update
 7932 root          0     0     0 B4  20   0 54776 16480 15916 R 84.1  1.6  0:16.60 │  │                          ├─ /usr/lib/apt/methods/rred
 7912 root          0     0     0 B4  20   0 24296  2036  1648 S  0.0  0.2  0:01.62 │  │                          ├─ /usr/lib/apt/methods/gzip
 7733 root          0     0     0 B4  20   0 27948  5552  1632 S  0.0  0.5  0:02.85 │  │                          ├─ /usr/lib/apt/methods/bzip2
 7711 root          0     0     0 B4  20   0 24304  1780  1436 S  0.0  0.2  0:00.00 │  │                          ├─ /usr/lib/apt/methods/gpgv
 7709 root          0     0     0 B4  20   0 30800  2200  1812 S  0.0  0.2  0:01.01 │  │                          └─ /usr/lib/apt/methods/http     

Potrei modificare manualmente tutti i processi ma stanno cambiando.

EDIT # 1

Il seguente comando:

# nice -n 19 ionice -n 7 -c 3 lb build

imposta anche:

ionice - imposta o ottiene la classe e la priorità di programmazione del processo. ...

-c, --class nome o numero della classe di pianificazione 0: nessuno, 1: in tempo reale, 2: best-effort, 3: inattivo

-n, --classdata scheduling data class 0-7 per le classi in tempo reale e best-effort

Come impostare -ce -nopzione ioniceper i processi?

Risposte:


8

Poiché tutti i processi figlio fanno ancora parte dell'ID sessione ( sessin psoutput), è possibile sfruttare tale fatto utilizzando questo comando:

$ parent=6187
$ ps -eo sess:1=,pid:1= |sed -n "s/^$parent //p"

Questo dovrebbe restituirci tutti gli ID di processo dei processi figlio generati da lb load. Possiamo anche ottenerlo direttamente da pgrep, utilizzando anche l' -sinterruttore.

$ pgrep -s $parent

Possiamo quindi renicefarli così:

$ renice $(pgrep -s $parent)

Esempio

Ecco un esempio inventato che, si spera, illustra come tutto funzioni. Iniziamo con una shell, "PID = 10515".

1. Conferma ID sessione
$ ps -j
  PID  PGID   SID TTY          TIME CMD
10515 10515 10515 pts/8    00:00:00 bash
30781 30781 10515 pts/8    00:00:00 ps
2. Lavori falsi

Quindi iniziamo alcuni lavori falsi che ci dimentichiamo di renice.

$ sleep 10000 &
$ sleep 10000 &

Confermiamo che sono sotto l'ID sessione della nostra shell ( SID).

$ ps -j
  PID  PGID   SID TTY          TIME CMD
10515 10515 10515 pts/8    00:00:00 bash
31107 31107 10515 pts/8    00:00:00 sleep
31111 31111 10515 pts/8    00:00:00 sleep
31140 31140 10515 pts/8    00:00:00 ps
3. Ottieni i PID associati al SID

Possiamo ottenere un elenco di tutti i processi, di cui SID10515.

$ pgrep -s 10515
10515
31107
31111
4. Conferma attuale piacevole

Qual è il buon livello di tutti al momento? Utilizzare questo comando per verificare:

$ ps -eo sess:1=,pid:1=,nice:1= | grep [1]0515
10515 10515 0
10515 31107 0
10515 31111 0
10515 31354 0
10515 31355 0
5. Cambia simpatico di tutti i discendenti SID

OK, quindi tutti sono nicea 0, cambiamolo.

$ renice $(pgrep -s 10515)
31107 (process ID) old priority 0, new priority 19
31111 (process ID) old priority 0, new priority 19
6. Conferma

Controlla il nostro lavoro:

$ ps -eo sess:1=,pid:1=,nice:1= | grep [1]0515
10515 10515 0
10515 31107 19
10515 31111 19
10515 31426 0
10515 31427 0

I PID 31107 e 31111 sono i nostri processi di sospensione e abbiamo semplicemente cambiato il loro simpatico a 19 con solo le informazioni su ciò a SIDcui sono associati.

7. Doppio controllo

Puoi anche controllare l' psoutput se sei davvero paranoico:

$ ps -eaf | grep -E "31107|31111"
saml     31107 10515  0 22:30 pts/8    00:00:00 sleep 10000
saml     31111 10515  0 22:30 pts/8    00:00:00 sleep 10000
saml     31531 10515  0 22:35 pts/8    00:00:00 grep --color=auto -E 31107|31111

Riferimenti

ionice

Se stai tentando di controllare la priorità di I / O dei processi e il loro buon livello, dovresti essere in grado di cambiare l'esempio di comando sopra in qualcosa di simile a questo:

$ renice -n 19 $(pgrep -s $parent)
$ ionice -c 3 -p $(pgrep -s $parent)

Se guardate la pagina man per ionicenon è possibile mescolare -c 3con -n.

   -c, --class class
          Specify the name or number of the scheduling class to use; 0 for
         none, 1 for realtime, 2 for best-effort, 3 for idle.

   -n, --classdata level
          Specify  the  scheduling class data.  This only has an effect if 
          the class accepts an argument.  For realtime and best-effort, 0-7 
          are valid data (priority levels).

reniceha bisogno anche di un -nparametro, quindi dovrebbe essere renice -n 19 $(pgrep -s $parent). Ho anche notato che ionicecambia. Al `renice -n 19 , spettacoli htop` B7, a -n 10, è B6, in -n -1, B3. Questo Bxcorrisponde a ionice -n x, giusto? C'è un modo per impostare ionice -c 3tutti i processi, oltre a un -nvalore diverso ?
Mikhail Morfikov,

@MikhailMorfikov: sì, il valore predefinito è 19 se lo ometti. Si noti che nella mia uscita sopra è stato ridotto a 19? Quello che stai chiedendo nel commento sopra non posso seguire (principalmente b / c della formattazione), puoi pubblicarlo come follow-up Q sul tuo Q originale? Modifica la tua Q e metti una sezione EDIT # 1 in fondo.
slm

@MikhailMorfikov - non puoi semplicemente eseguire 2 comandi usando l'approccio che ho descritto sopra? renice -n 19 $(pgrep -s 10515); ionice -c 3 -n 7 -p $(pgrep -s 10515)?
slm

ionice -c 2 -n 1 -p $(pgrep -s 8973)lavori. Se si desidera utilizzare -ncon ionice, non è possibile utilizzare -c 3. Dovrebbe essere -c 2per esempio. Guarda la domanda.
Mikhail Morfikov,

@MikhailMorfikov - sì ho appena capito che nella mia prova che non si può mescolare -c 3con -n. Siamo contenti di averlo capito e il tuo problema sembra essere stato risolto, grazie per la Q!
slm
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.