Buongiorno.

vorrei eseguire un comando se connesso ad internet oppure un altro comando se non connesso.

però il comando se connesso, prima deve effettuare un controllo se come da titolo il processo è in esecuzione non deve eseguire il comando quindi sto cercando come fare.

con il comando: "ps aux | grep gedit" con gedit chiuso ottengo:

user      1955  0.0  0.0   4700   816 pts/4    D+   09:11   0:00 grep --color=auto gedit

mentre con gedit aperto ottengo:

user      3968  1.8  0.5 210768 21528 ?        Sl   09:12   0:00 gedit --new-window
user      4003  0.0  0.0   4700   816 pts/4    S+   09:12   0:00 grep --color=auto gedit

e così non va bene,perchè cmq grep legge sempre gedit (gedit è solo un esempio)

quindi se faccio così:

if `ps aux | grep gedit &> /dev/null`; then echo "positivo"; else echo "negativo"; fi

ovviamente mi da sempre positivo anche se aprendo il monitor di sistema il processo non è in esecuzione,da dove salta fuori quel "--color=auto gedit" ? ci sarà un modo per ignorare quel --color=auto gedit ? Grazie

Saluti

chiesto 09 Gen '15, 09:58

Davide_74's gravatar image

Davide_74
592175268

modificato 09 Gen '15, 10:44

dadexix86's gravatar image

dadexix86 ♦♦
16.9k716161

forse ho risolto con:

"if ps | grep gedit &> /dev/null; then echo "positivo"; else echo "negativo"; fi"

provato meglio e non va bene :(

(09 Gen '15, 10:45) Davide_74 Davide_74's gravatar image

La soluzione migliore per vedere se un processo di dato nome è attivo è pgrep, che non soffre del problema che stai riscontrando (è costruito apposta):

if pgrep processo >/dev/null; then
    : # il processo è attivo, fai qualcosa
fi

Ancora meglio, si può usare solo pkill con segnale 0, senza scomodare grep

if pkill -0 processo >/dev/null; then
    : # il processo è attivo, fai qualcosa
fi

Un'alternativa frequentemente usata, quando non si dispone di pgrep è la seguente

if ps | grep -q '[p]rocesso'; then
        : # il processo è attivo, fai qualcosa
fi

mettendo una lettera del nome tra parentesi quadre. Non sto qui a spiegare perché funziona.

coll. permanente

ha risposto 09 Gen '15, 13:15

enzotib's gravatar image

enzotib ♦♦
14.0k112186

modificato 09 Gen '15, 13:17

@enzotib Potresti mettere un link a un riferimento su questa struttura dell'if in bash senza parentesi (quadre o tonde) attorno all'espressione condizionale?
Quando ho studicchiato un po' di bash tutti i manuali dicevano (e quelli che ho trovato dicono ancora) di mettere almeno le quadre.

Grazie :)

(09 Gen '15, 13:39) dadexix86 ♦♦ dadexix86's gravatar image

@dadexix86: il riferimento è la pagina di manuale di bash, dove la sintassi del comando if è descritta come segue:

if list; then list; [ elif list; then list; ] ... [ else list; ] fi

Inoltre, nella stessa pagina di manuale, una lista è descritta nel modo seguente

A list is a sequence of one or more pipelines separated by one  of  the
   operators ;, &, &&, or ||, and optionally terminated by one of ;, &, or
   <newline>.

Le parentesi quadre (singole) non sono altro che un comando sul disco, verificare con

ls -l /bin/[

mentre le parentesi quadre doppie sono un comando interno di bash, simile ma più potente rispetto a quelle singole.

In ogni caso, la fonte di tutta la conoscenza è la pagina di manuale di bash e la permanenza nel canale IRC #bash di Freenode.

(09 Gen '15, 14:11) enzotib ♦♦ enzotib's gravatar image

Magnifico, grazie :)

(09 Gen '15, 14:15) dadexix86 ♦♦ dadexix86's gravatar image

un grazie sembra poco ma è l unica moneta virtuale "Gratis"

adesso devo accettare la risposta ? credo la migliore sia quella di @enzotib, giusto @dadexix86 ?

comunque dalla mia profonda ignoranza,bastava una p davanti a grep :)

e poi aggiungo, in fine la domanda è diventata interessante,perchè nessuno la votata ? :(

Salui e di nuovo Grazie

(09 Gen '15, 22:21) Davide_74 Davide_74's gravatar image

Il --color=auto gedit fa parte del grep che lanci: grep --color=auto gedit.

Infatti, grep ha un alias di default, che puoi controllare con:

$ alias grep
alias grep='grep --color'

Non so se si può escludere l'ultima riga (ma penso di sì), però la soluzione più rapida che mi viene in mente è contare le righe, passando ancora l'output a wc -l:

ps axu | grep gedit | wc -l

che ti mostra 1 se non c'è gedit o un altro numero maggiore 1 se gedit è aperto.

Ti basta quindi controllare con

if [ $(ps aux | grep gedit | wc -l) -gt 1 ]; then echo "positivo"; else echo "negativo"; fi

Nota ancora che l'if che hai scritto tu ti risponderà sempre positivo, perché è scritto male.
La sintassi degli if la trovi o sul manuale o online, ad esempio qui, e come vedi necessitano tutti di parentesi attorno all'espressione condizionale.

coll. permanente

ha risposto 09 Gen '15, 10:57

dadexix86's gravatar image

dadexix86 ♦♦
16.9k716161

modificato 09 Gen '15, 10:57

@dadexix86: piuttosto che contare il numero di righe di output di grep, è meglio verificare l'exit code:

if ps aux | grep -q gedit; then
(09 Gen '15, 13:18) enzotib ♦♦ enzotib's gravatar image

@enzotib questo risolve il problema?

Nel senso, grep trova sempre almeno una volta gedit (nel processo grep -q gedit), almeno così mi sembra dalle prove a 'gedit` chiuso che ho fatto ora.

(09 Gen '15, 13:36) dadexix86 ♦♦ dadexix86's gravatar image
1

@dadexix86: il mio commento non era una soluzione generale, che ho dato invece nella mia risposta, era solo per segnalare che in ogni caso la sintassi che avevi usato era eccessivamente prolissa, e la stessa cosa si poteva fare più efficientemente usando la sintassi opportuna.

(09 Gen '15, 13:55) enzotib ♦♦ enzotib's gravatar image

Ma il tuo commento e la mia sintassi prolissa non fanno la stessa cosa :)

ps aux | grep -q gedit

torna sempre vero anche quando gedit è chiuso, perché trova sempre almeno una corrispondenza (data dal grep)...

(09 Gen '15, 14:02) dadexix86 ♦♦ dadexix86's gravatar image

@dadexix86: scusa, sì, hai ragione, non ho notato il -gt 1, pensavo fosse -gt 0.
In questo caso, allora io farei

if ps aux | grep gedit | grep -v grep; then...
(09 Gen '15, 14:14) enzotib ♦♦ enzotib's gravatar image

Ottimo, grazie :)

Ancora una cosa, perché sono molto, molto, molto ignorante in materia...
Sarebbe possibile accorciare ancora di uno step con le espressioni regolari e magari l'opzione -E, chiamando quindi una volta sola grep?

(09 Gen '15, 14:19) dadexix86 ♦♦ dadexix86's gravatar image

Come ho scritto nella mia risposta, un trucco spesso usato è il seguente:

if ps | grep -q '[p]rocesso'; then ...
(09 Gen '15, 14:25) enzotib ♦♦ enzotib's gravatar image

Ho capito! :D

Chiedendo di matchare [g]edit il comando che chiami non viene più visto dal grep! :D

Ci ho messo un po' ma ce l'ho fatta :P Grazie!

(09 Gen '15, 14:40) dadexix86 ♦♦ dadexix86's gravatar image

chiedo scusa,forse meglio fare un altra domanda?

ma siamo li con il problema,poi il titolo non mi veniva cioè troppo lungo :) devo sempre controllare un processo prima di eseguire un comando/script però questa volta mi servirebbe se "possibile" cioè controllo il processo, non è in esecuzione? ok parte il comando e termina,è in esecuzione il processo? ok il comando non parte però non deve terminare cioè deve soltanto terminare quando parte il comando. Spero di essermi spiegato Saluti e Grazie

(19 Ago '15, 10:31) Davide_74 Davide_74's gravatar image
La tua risposta
abilita/disabilita anteprima

Segui questa domanda

Via email:

Una volta eseguito l'accesso potrai iscriverti a tutti gli aggiornamenti qui

Via RSS:

Risposte

Risposte e commenti

Basi di markdown

  • *corsivo* o __corsivo__
  • **grassetto** o __grassetto__
  • collegamento:[testo](http://url.com/ "titolo")
  • immagine?![alt testo](/path/img.jpg "titolo")
  • elenco numerato: 1. Foo 2. Bar
  • per aggiungere un'interruzione di riga, aggiungi due spazi a fine riga e premi «Invio»
  • è supportato anche semplice HTML

Tag:

×91

domanda posta: 09 Gen '15, 09:58

domanda visualizzata: 1,661 volte

ultimo aggiornamento: 19 Ago '15, 10:32

Chiedi è un servizio di supporto gestito da Ubuntu-it. Contattaci!

powered by OSQAPostgreSQL database
Ubuntu e Canonical sono marchi registrati da Canonical Ltd.