verifica lo stato di un processo di "sospensione" in corso dal terminale

3

C'è un modo per verificare per quanto tempo un processo di "sospensione" in esecuzione è partito prima che finisca nel terminale?

    
posta BarryBluejeans 06.08.2018 - 20:43
fonte

2 risposte

4

Il comando di sospensione di per sé non offre alcun servizio che permetta il monitoraggio del tempo di sonno rimanente. Inoltre, non viene visualizzato da nessuna parte.

Poiché il comando sleep funziona senza emettere una serie di chiamate di sistema per il kernel, non sarà possibile utilizzare uno strumento di debug tipico come dtruss. Se si tenta di utilizzare il debugger lldb per collegarsi al processo, si scoprirà che il comando di sospensione è anche interrotto e non può essere continuato.

Quindi non è così possibile determinare con molta precisione la quantità di tempo rimasto. Se puoi accontentarti di un risultato impreciso, procedi come segue:

Per prima cosa esegui questo comando:

ps xa | grep sleep

Questo dovrebbe mostrarti il comando di sonno con il numero di secondi in cui dovrebbe dormire in totale. Ad esempio:

1234 s0123 S+    0:00.01 sleep 789

Qui 789 è il numero di secondi in cui il comando dovrebbe dormire in totale.

Quindi esegui questo comando:

ps xa -o etime,command -c | grep sleep

Ti mostrerà il tempo totale in cui il processo è stato eseguito:

  03:15 sleep

Ciò significa che il processo ha sonno per 3 minuti e 15 secondi = 195 secondi. Il tempo di sospensione rimanente è 789 - 195 = 594 secondi.

    
risposta data 06.08.2018 - 22:05
fonte
2

Se la tua versione di ps supporta etimes ( etime in secondi ) (sfortunatamente non è supportata su MacOS), puoi utilizzarla per calcolare il tempo rimanente:

ps xa -o etimes,command | awk '/[s]leep/ {print "time remaining for", $2, "is", $3 - $1, "seconds"}'

Esempio di output:

time remaining for sleep is 94 seconds

O puoi semplificare per mostrare solo il numero:

ps xa -o etimes,command | awk '/[s]leep/ {print $3 - $1}'

Questi comandi generano più di una riga se è in esecuzione più di un processo di sleep .

Nota: Né etimeetimes genera secondi frazionari, ma sleep può accettarli come argomento. Ciò probabilmente influirà sulla precisione del tuo calcolo.

Per MacOS e altri senza etimes , puoi convertire etime ( ddd-hh:mm:ss ) in secondi invertendo i calcoli fatti nell'origine di ps (in print.c ):

ps xa -o etimes,command | awk '
    BEGIN {
        f = "1 60 3600 86400";
        split(f, factors)
    }
    /[s]leep/ {
        split($1, parts, "[-:]");
        count = length(parts);
        for (i = count; i > 0; i--) {
            e += parts[i] * factors[count + 1 - i]
        };
        print e;
        e = 0
     }'
    
risposta data 07.08.2018 - 01:30
fonte

Leggi altre domande sui tag