Pagina 1 di 1

Aiuto per script bash e variabili nidificate

Inviato: lun 17 set 2007, 19:24
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

Inviato: lun 17 set 2007, 21:38
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...

Re: Aiuto per script bash e variabili nidificate

Inviato: lun 17 set 2007, 22:07
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

Inviato: lun 17 set 2007, 22:16
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...

Inviato: lun 17 set 2007, 22:23
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

Inviato: lun 17 set 2007, 23:03
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.

Inviato: lun 17 set 2007, 23:07
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...

Inviato: lun 17 set 2007, 23:14
da anycolouryoulike
In bash, ma SU non è scritto in bash, e la bash gli può passare solo argomenti...
Ovviamente sarei felicissimo di sbagliarmi!

Inviato: mar 18 set 2007, 2:09
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

Inviato: mar 18 set 2007, 14:19
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

Inviato: mar 18 set 2007, 16:08
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

Inviato: dom 23 set 2007, 19:05
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