Come sapere quale comando viene eseguito senza fermarlo?


20

Nel mio esempio, sto eseguendo un comando che richiede molto tempo per essere eseguito (diverse ore).

Non ricordo davvero se ho inserito make o make -j4.

Ovviamente potrei fermarlo e premere il tasto o controllare la cronologia per conoscerlo, ma questo fermerebbe il processo e non voglio che ciò accada (nel caso in cui stia già facendo make -j4).

Esiste un modo per sapere quale comando viene eseguito senza interrompere il processo?


5
Da un altro terminale, provapgrep -a make
John 1024

2
Nel caso in cui makeè possibile interrompere e riavviare e dovrebbe riprendere da dove era stato interrotto.
user253751

Risposte:


34

Se vuoi vedere l'intera riga di comando per ogni istanza makeche è in esecuzione sul tuo computer, apri un nuovo terminale e prova:

pgrep -a make

pgrepè un programma che cerca attraverso tutti i processi sul tuo computer. In questo caso, sta cercando programmi denominati make. L'opzione -aindica pgrepdi elencare sia l'ID processo sia la riga di comando completa per ogni processo corrispondente. (Senza -a, restituirebbe semplicemente l'ID del processo.) Per ulteriori informazioni sulle molte opzioni di pgrep, vedere man pgrep.


7
Questo è utile per casi semplici come quello nella domanda. Tuttavia, se il comando riguardava pipeline, loop, sequenze di comandi, comandi interni o espansione variabile, ciò che avresti trovato pgrepapparirebbe diverso dal comando digitato sulla riga di comando.
Kasperd,

28

Mentre la finestra del terminale è attiva, è possibile mettere in pausa (sospendere) il processo premendo Ctrl+ Z. È quindi possibile inserire il lavoro in background digitando bg(il lavoro continuerà ora in background e allo stesso tempo è possibile lavorare sulla riga di comando; ciò equivale a iniziare un lavoro con &alla fine della riga di comando). Quindi utilizzare le frecce cursore (su e giù) per vedere quale comando hai usato. Se lo desideri (ma questo non è necessario) puoi quindi portare il tuo lavoro in primo piano digitando fg.


7
Funziona con alcuni comandi ma non tutti. Ad esempio, se si digitasse un ciclo come quello, for X in {1..1000} ; do sleep $X ; doneil ciclo verrebbe interrotto e le iterazioni rimanenti non si verificherebbero.
Kasperd,

11
@kasperd Sì, abbastanza fastidioso se me lo chiedi, ma ho scoperto una bella soluzione per quel problema. Circondare un comando complicato come quello tra parentesi, quindi è una subshell. Quindi Ctrl-Z sospenderà l'intera subshell e riprenderà correttamente.
penguin359,

@kasperd Non in bash, ma lo fanno in zsh.
JoL

4
Non c'è bisogno di mettere il lavoro in secondo piano: è sufficiente sospenderlo, controllare la cronologia (o jobs, come mostrato nella risposta di @ ichabod), e quindi riprenderlo tramite fg.
Konrad Rudolph,

10

Faccio qualcosa come Stefan: ^ Z per mettere in pausa il lavoro, e poi corro jobs. Se sono in esecuzione più processi, potrebbe essere necessario ordinare quale lavoro è stato interrotto, ma in genere ciò fornirà la riga di comando. Quindi eseguire fgper continuare l'esecuzione.


1

Un buon modo per vederlo in modo dinamico è eseguire top, e questo ti dice lo stato generale del sistema e i processi in esecuzione sul sistema.

Fare un 'ps ux' mostra i tuoi processi insieme a pid e altre informazioni, puoi usare l'abilità per ucciderne alcuni se lo desideri, man page per quella è una buona risorsa, e fare un'abilità o uccidere -9 ottiene processi appiccicosi sospeso in attesa del dispositivo, ecc. È inoltre possibile inviare altri segnali a processi come -hup, riavviare i demoni, ecc.

Top è bello poiché mostra la dimensione del processo, il tempo trascorso e gli stati attuali della cpu e quello della memoria e dello scambio.

Faccio spesso $ make> & make.out & e poi less o tail -f sul file di log make.out. Da adesso make è staccato come processo dalla mia sessione di shell.

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.