Meno interruzioni in meno


11

Spesso canalizzo l'output del programma su un valore inferiore, ad es.

produce_output | less

Funziona alla grande, fino a quando produce_output produce grandi quantità di output. Se cerco un testo che si trova in profondità nel file, meno report

Calculating line numbers... (interrupt to abort)

Se interrompo con Control + C, uccide anche produce_output, che impedisce di produrre ulteriori risultati. C'è un modo per inviare l'interruzione a meno, in modo che produce_output continua a correre?

So che potrei usare kill -INT less_process, ma penso che ci debba essere una soluzione migliore.

Risposte:


13

Normalmente tutti i processi in una pipeline funzionano nello stesso modo gruppo di processi , facendo sì che tutti loro ricevano il segnale. Puoi usare setsid foo | less correre foo in un altro pgrp.


Alla luce del problema sollevato da OP sembra che la decisione di utilizzare CTRL + C come un modo per interrompere meno è molto spiacevole. Sai perché è stato scelto questo specifico segnale? Qualche altro segnale sarebbe meno problematico?
Piotr Dobrogost

@PiotrDobrogost: quale altro segnale suggeriresti? Non ci sono molti che hanno scorciatoie da tastiera dedicate, solo SIGINT (Ctrl-C) e SIGQUIT (Ctrl- \), e quest'ultimo è pensato per uscire immediatamente dal programma, non semplicemente interromperlo. Il resto sono disponibili solo tramite kill.
grawity

Sembra che il problema sia causato dall'uso del segnale per interrompere meno. Invece, se fosse un po ' normale chiave / scorciatoia non avremmo il problema in primo luogo. Tuttavia, suppongo che la necessità di un segnale derivi dal fatto che il processo non può essere utilizzato select attendere l'input sia da un file / pipe e terminale allo stesso tempo.
Piotr Dobrogost

@PiotrDobrogost: Può, è così che il F (segue) funziona la modalità. Tubi e tty sono pollabili allo stesso modo.
grawity

Perché pensi che sia il modo in cui funziona la modalità di follow? Penso che il flusso degli eventi sia che la shell ottiene CTRL + C e invia il segnale SIGINT a meno che ottiene questo segnale in modo asincrono senza ascoltando alla tastiera / terminale.
Piotr Dobrogost

9

È possibile disabilitare i numeri di riga con

   -n or --line-numbers

opzione.

produce_output | less -n

-1: può risolvere il problema istigatore dell'OP, ma non fa nulla per rispondere alla domanda effettiva dell'OP (cioè, interrompere un processo).
goldPseudo

2
Scusa ma iniziare meno con una funzione che non è desiderata e quindi provare a inviare un segnale per disabilitare una funzionalità che puoi disabilitare con un interruttore è una soluzione e non una soluzione. Ovviamente la soluzione @grawity è carina (e io ho votato) ma dai: iniziare il primo processo in un altro gruppo per poter inviare un segnale per interrompere un'attività (il conteggio delle linee) che non è necessario è davvero un po 'troppo molto lavoro.
Matteo

1
Questa è una soluzione equa al problema che ho posto nella mia domanda. Tuttavia, le interruzioni interrompono più del semplice conteggio delle linee in meno - ad esempio, interromperanno anche una lunga ricerca. Quindi, la soluzione di @ grawity è preferibile, dal momento che coprirebbe qualsiasi utilizzo di interruzioni in meno. Il mio male per non aver affrontato questo più chiaramente nella domanda!
Ed McMan

@EdMcMan Certo, ho anche votato la soluzione per la gravità e sono felice di imparare qualcosa di nuovo che può essere sempre utile.
Matteo

0

Lavorando con grandi quantità di output, ho trovato molto utile inviare l'output a un file e usarlo tail -f o less +F da guardare, ad es .:

produce_output > out 2>&1 & less +F out

Il 2>&1 la sintassi assicura che sia stdout che stderr vadano a out --- rimuovi quello se vuoi che stdout passi al file. In questo modo, è possibile controllare l'output in vari modi (anche da una macchina diversa) senza dover incasinare con il programma che produce l'output.

Nota che 2>&1 può essere bash-specifico (non sono sicuro). Assicurati di avere sufficiente spazio su disco per il file di output :-)


Tail ti mostrerà solo il file, Ed ha specificato che sta usando meno interattivamente (ad esempio, deve cercare nel file)
Matteo

2>&1 è POSIX, nudo >& è un bashismo.
grawity

FWIW, 2 & gt; & amp; 1 funziona anche su Windows XP, 7, 2008, ecc.
jftuga

@Matteo: sì, avrei dovuto usarlo less +F nel mio esempio; Ho appena aggiornato la mia risposta.
jrennie

1
@Matteo: il conteggio delle righe non è lo stesso problema con less +F (da less +F elabora i dati così come vengono generati). L'esempio che ho dato fa non avere lo stesso problema dell'originale pubblicato: ctrl + c non interromperà process_output. Se uno non si cura della funzionalità 'follow', si può eseguire produce_output > out 2>&1, poi less out. Un problema con produce_output | less è che se qualcosa rompe il tubo (ad esempio colpendo accidentalmente 'q' da less ), poi produce_output morirà (senza gestione SIGPIPE speciale).
jrennie

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.