Aiuto per script bash e variabili nidificate

Se avete problemi con l'installazione e la configurazione di Slackware postate qui. Non usate questo forum per argomenti generali... per quelli usate Gnu/Linux in genere.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Slackware, se l'argomento è generale usate il forum Gnu/Linux in genere.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Aiuto per script bash e variabili nidificate

Messaggio da anycolouryoulike »

Ho scritto questo script che mi restituisce la shell dove è eseguito un processo passandogli come argomento il pid del processo desiderato:

Codice: Seleziona tutto

#!/bin/sh
if [ -e $1 ]
then
	ps -p $1 |cut -d "
" -f 2| cut -d " " -f 3
	exit
else
	echo "Needs arguments"
	exit
fi
Ho due domande:

Voglio inserire questo script in conky usando come argomento la variabile di conky top pid, il problema è che non riesco ad accedere a questa variabile in quanto questo script è parte di un'altra variabile, cioé la variabile exec di conky che lo esegue. Avrei quindi bisogno (pensando al C) di una specie di puntatore... esiste qualcosa di simile per uno script bash? Oppure esiste qualche altra soluzione al mio problema?

Altra domanda (stupida):
Per eseguire questo script con successo devo cambiare

Codice: Seleziona tutto

if [ -e $1 ]
con

Codice: Seleziona tutto

if [ ! -e $1 ]
perché altrimenti mi dice "Needs arguments" anche se l'argomento glielo metto. Perché?

Grazie

Avatar utente
danix
Staff
Staff
Messaggi: 3289
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 6.12.13 x86_64
Desktop: i3
Località: Verona (VR)
Contatta:

Messaggio da danix »

Dire che me ne intendo di scripting bash è a dir poco un'esagerazione, comunque ci provo... :D
non credo di aver capito bene cosa vuoi fare, e sopratutto l'utilità di questo script, comunque, se vuoi passare l'output di top ad uno script puoi usare top in modalità batch avviandolo con l'opzione -b... come al solito "man top" :D

Per quanto riguarda lo script devi cambiare qualcosa...

Codice: Seleziona tutto

#!/bin/sh
if [[ "$1" == "" ]]
then
   echo "Needs arguments"
else
   ps -p $1 |cut -d "
" -f 2| cut -d " " -f 3
   exit
fi
provalo e vedi se va... :)

Come hai fatto tu, controllavi semplicemente l'esistenza di $1, che c'è sempre ma se non diversamente specificato è uguale a ""...
ho usato il quoting su $1 perchè mi serviva la corrispondenza letterale ;)

Ciau...
danix
danix ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
urka58
Linux 3.x
Linux 3.x
Messaggi: 543
Iscritto il: mer 7 dic 2005, 23:29

Re: Aiuto per script bash e variabili nidificate

Messaggio da urka58 »

Altra domanda (stupida):
Per eseguire questo script con successo devo cambiare

Codice: Seleziona tutto

if [ -e $1 ]
con

Codice: Seleziona tutto

if [ ! -e $1 ]
perché altrimenti mi dice "Needs arguments" anche se l'argomento glielo metto. Perché?

Grazie
[ -e è un'opzione di verifica sui file, sulle stringhe devi usare l'opzione -n (non nulla) o [ -z (nulla)
Per maggiori particolari man [
Ciao

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Messaggio da anycolouryoulike »

Il secondo problema l'ho risolto. Grazie!
Il primo problema lo spiego meglio.

Su conky è possibile vedere grazie alle variabili il PID, la percentuale di utilizzo della CPU e la percentuale di RAM utilizzata dai vari processi ordinati per utilizzo di CPU o di RAM. Io volevo visualizzare anche la shell su cui è in esecuzione i processi e anche qualche altro dato, per questo ho scritto quello script da usare così nel .conkyrc

Codice: Seleziona tutto

${top name 1}${top pid 1}${top cpu 1}${top mem 1}${exec /home/alessandro/shell.sh ${top pid 1}}
L'argomento dello script quindi dovrebbe essere il PID del processo che utilizza più CPU, cioé la variabile di conky ${top pid 1}, solo che su conky esce solo l'ultima parentesi graffa, perché utilizza ${top pid 1} come testo e non come variabile.
Chiedevo quindi come accedere alla variabile ${top pid 1} all'interno della variabile exec che esegue lo script... una specie di puntatore in stile C, oppure come esportare la variabile in qualche altro modo a me oscuro...

Avatar utente
danix
Staff
Staff
Messaggi: 3289
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 6.12.13 x86_64
Desktop: i3
Località: Verona (VR)
Contatta:

Messaggio da danix »

anycolouryoulike ha scritto:oppure come esportare la variabile in qualche altro modo a me oscuro...
come ti ho detto per esportare in uno script un valore visualizzato da top esiste la modalità batch di top (top -b) "man top" per approfondire, detto questo, non credo che sia fattibile una cosa dinamica come succede con conky che legge in real time top, a meno di mettere il tuo script in esecuzione con texeci ogni secondo...
Se vuoi provare, dovresti, nel tuo script, redirigere l'output di top -b in una pipe, ripulirlo lasciando solo quello che ti interessa e poi darlo in pasto come variabile (invece che come argomento) al ps -p che già hai strutturato...

spero di essere stato chiaro...
posta se hai dubbi... :)

ciau
danix
danix ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Messaggio da anycolouryoulike »

Ho impostato conky per aggiornarsi ogni secondo, quindi anche exec dovrebbe rieseguire tutto ogni secondo.
Comunque ho fatto tutto con le pipe ed il top -bn 1 (visto che le variabili di conky non sono esportabili ad altri programmi).
Ora faccio uno script per ottenere pure i dati dei processi ordinati però secondo l'utilizzo di memoria e non della CPU come fa top.
Grazie

Ho capito cosa vuoi fare qui viewtopic.php?t=20766.
Il discorso è simile: si tratta di esportare la variabile letta dal read al programma su...
Non credo sia possibile con uno script bash... al massimo si potrebbe trasmettere come argomento ma è impossibile anche questo visto che la password non può essere immessa come argomento nel su...
Ugualmente non è possibile trasmettere le variabili di Conky al mio script...
Tutto ciò naturalmente secondo le poche cose che ho imparato io.

Avatar utente
danix
Staff
Staff
Messaggi: 3289
Iscritto il: ven 27 ott 2006, 19:32
Nome Cognome: Danilo M.
Slackware: 64 current
Kernel: 6.12.13 x86_64
Desktop: i3
Località: Verona (VR)
Contatta:

Messaggio da danix »

la redirezione è possibile in bash, ma io non so come fare... comunque mi fa piacere che tu sia venuto a capo del tuo problema...
alla fine posta il risultato che voglio vedere com'è ;)

A presto...
danix
danix ha scritto:non sono molto presente sul forum, e di ciò mi scuso con tutti

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Messaggio da anycolouryoulike »

In bash, ma SU non è scritto in bash, e la bash gli può passare solo argomenti...
Ovviamente sarei felicissimo di sbagliarmi!

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Messaggio da targzeta »

anycolouryoulike ha scritto: Ovviamente sarei felicissimo di sbagliarmi!
Ovviamente ti sbagli :).
I problemi sono diversi, il tuo problema non è della bash, ma riguarda conky. E' conky che non passa niente allo script, molto probabilmente perchè non è stato previsto il passaggio di variabili interne nel comando ${exec} di conky. Sta tranquillo che se conky passava al tuo script, il pid del processo, allora il tuo script si trovava come $1 il pid del processo.

Tramite bash non passi solo argomenti ad un programma (gli argomenti sono quelli che si passano sulla 'riga di comando' di un programma), ma puoi benissimo passargli anche lo standard input tramite pipe o ridirezione. Il problema di danix85 però è un altro.

Spina

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Messaggio da anycolouryoulike »

Grazie del chiarimento spina, ma non credo di essermi sbagliato: hai confermato quello che ho scritto. :)
spina ha scritto:I problemi sono diversi, il tuo problema non è della bash, ma riguarda conky. E' conky che non passa niente allo script, molto probabilmente perchè non è stato previsto il passaggio di variabili interne nel comando ${exec} di conky. Sta tranquillo che se conky passava al tuo script, il pid del processo, allora il tuo script si trovava come $1 il pid del processo.
So che è il problema è di conky, perchè (come ho detto prima) non mi fa accedere a quella variabile dentro alla variabile exec, per questo pensavo a una specie di puntatore. So che la redirezione è possibile, ma nel caso dello script che sta facendo danix la bash non può interagire con su finchè su è in esecuzione.
spina ha scritto:Tramite bash non passi solo argomenti ad un programma (gli argomenti sono quelli che si passano sulla 'riga di comando' di un programma), ma puoi benissimo passargli anche lo standard input tramite pipe o ridirezione. Il problema di danix85 però è un altro.
Appunto, ma su non prende nessun standard input, prende solo argomenti!

Correggimi ancora se mi sbaglio. :D

Avatar utente
targzeta
Iper Master
Iper Master
Messaggi: 6643
Iscritto il: gio 3 nov 2005, 14:05
Nome Cognome: Emanuele Tomasi
Slackware: 64-current
Kernel: latest stable
Desktop: IceWM
Località: Carpignano Sal. (LE) <-> Pisa

Messaggio da targzeta »

anycolouryoulike ha scritto:Grazie del chiarimento spina, ma non credo di essermi sbagliato: hai confermato quello che ho scritto. :)
Allora vuol dire che avevo capito male io :).

Spina

Avatar utente
anycolouryoulike
Packager
Packager
Messaggi: 1158
Iscritto il: ven 10 ago 2007, 0:00
Slackware: 12.2
Kernel: 2.6.34.8
Desktop: KDE 3.5.10

Messaggio da anycolouryoulike »

danix85 ha scritto:la redirezione è possibile in bash, ma io non so come fare... comunque mi fa piacere che tu sia venuto a capo del tuo problema...
alla fine posta il risultato che voglio vedere com'è ;)

A presto...

Codice: Seleziona tutto

#!/bin/bash
# Script che visualizza l'user (-u), la shell (-s),
# il time (-r) o lo start (-t) del processo identificato
# dal secondo argomento ($2) per ordine di utilizzo di RAM (-r) o CPU (-c).

if
	[ -n $3 ]
then
	:
else
	echo "Needs arguments"
	exit
fi

case $3 in
	-c)	usage=$"2" ;;
	-r)	usage=$"3" ;;
	-*)	echo "Invalid argument" ; exit ;;
esac

count=$2

process ()
{
	ps aux |sed 1d |sort -nr +3 |sed -n "$count"p
}

end ()
{
	line=$1
	if
		[ -z "$line" ]
	then
		echo "Invalid process number"
		exit
	else
		echo $line
		exit
	fi
}

shell ()
{
	end `process |awk '{print $7}'`
}

start_timer ()
{
	end `process |awk '{print $9}'`
}

run_timer ()
{
	end `process |awk '{print $10}'`
}

user ()
{
	end `process |awk '{print $1}'`
}

case $1 in
	-s)	shell ;;
	-r)	run_timer ;;
	-t)	start_timer ;;
	-u)	user ;;
	-*)	echo "Invalid argument" ; exit ;;
esac
Son riuscito a finirlo solo oggi.
Gli argomenti vanno messi nell'ordine con cui sono scritti nei commenti all'inizio dello script.
Io l'ho messo su Conky e sembra funzionare...
Se hai qualche miglioramento da apportare fammelo sapere!
Ciao :D

Rispondi