[bash] Return value op CLI anders dan in script

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Mijn wtf momentje van de dag:

Ik wil kijken of snmpd draait op een bepaalde freebsd machine. Dat is prima te doen met:
[root@newatlas boudewijne]# ps aux | grep snmpd | grep -vq grep
[root@newatlas boudewijne]# echo $?
1

De -q omdat de output niet nuttig is en de -v grep om te voorkomen dat grep zichzelf gaat vinden.
Mijn shell is bash.

Prima. Als ik echter een script maak:
code:
1
2
3
4
5
6
7
#!/bin/bash


ps aux | grep snmpd | grep -vq grep
echo ${PIPESTATUS[0]}${PIPESTATUS[1]}${PIPESTATUS[2]}${PIPESTATUS[3]}${PIPESTATUS[4]}
echo $?
exit


Met daarin 1 van beide echo's dan krijg ik altijd 0 terug. Waarom is dit anders? en hoe te fixen? :P

i3 + moederbord + geheugen kopen?


Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 10:47

Kees

Serveradmin / BOFH / DoC
ik krijg hier gewoon 1 terug als ik die echo direct na het commando doe. Echo zelf heeft ook een exit status, dus in je script krijg je de exitstatu terug van het commando ervoor. Voorbeeld:


kees@kees(13:19:04)(0):~
~$ ps aux | grep snmpd | grep -vq grep

kees@kees(13:19:10)(1):~
~$ echo $?
1

kees@kees(13:20:07)(0):~
~$ echo $?
0

(bij mij staat de exit status overigens al in mijn prompt, te vaak echo $? te laat getyped ;))

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Acties:
  • 0 Henk 'm!

  • ripperke
  • Registratie: Augustus 2003
  • Laatst online: 19-08 16:06

ripperke

w00t!

offtopic:
[quote]Boudewijn schreef op vrijdag 01 april 2011 @ 13:05:
.. en de -v grep om te voorkomen dat grep zichzelf gaat vinden.
[/quote]
ps aux |grep -q [s]nmpd ;-)

If TCP/IP handshaking was less formal, perhaps SYN/ACK would be YO/WASSUP


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Ja maar ik heb atm *geen* snmpd draaien:
[root@newatlas boudewijne]# ps aux | grep snmpd
root      3540  0.0  0.0  3732  672 pts/2    S+   13:32   0:00 grep snmpd
DIAGNOSTICS
Normally, exit status is 0 if selected lines are found and 1 otherwise. But the exit status is 2 if an
error occurred, unless the -q or --quiet or --silent option is used and a selected line is found.
Derhalve zou ik een 0 verwachten in een dezer script:
code:
1
2
3
4
#!/bin/bash
ps aux | grep snmpd | grep -vq grep
echo ${PIPESTATUS[0]}${PIPESTATUS[1]}${PIPESTATUS[2]}${PIPESTATUS[3]}${PIPESTATUS[4]}
exit


code:
1
2
3
4
#!/bin/bash
ps aux | grep snmpd | grep -vq grep
echo $?
exit

i3 + moederbord + geheugen kopen?


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
ripperke schreef op vrijdag 01 april 2011 @ 13:44:
offtopic:
[quote]Boudewijn schreef op vrijdag 01 april 2011 @ 13:05:
.. en de -v grep om te voorkomen dat grep zichzelf gaat vinden.
[/quote]
ps aux |grep -q [s]nmpd ;-)
Okay handig maar dat lost mijn probleem niet op. Wel mooier though.

i3 + moederbord + geheugen kopen?


Acties:
  • 0 Henk 'm!

  • Rainmaker
  • Registratie: Augustus 2000
  • Laatst online: 14-07-2024

Rainmaker

RHCDS

Loop je niet ergens tegen een bash / shell builtiin aan?

Probeer eens expliciet overal (/usr)/bin voor te zetten.

PS. nog mooier:
code:
1
ps -ef | grep snmp[d]


Edit: die was al genoemd dus :p

[ Voor 28% gewijzigd door Rainmaker op 01-04-2011 17:37 ]

We are pentium of borg. Division is futile. You will be approximated.


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Dat zou ik wel eens kunnen doen?

i3 + moederbord + geheugen kopen?


Acties:
  • 0 Henk 'm!

  • Rainmaker
  • Registratie: Augustus 2000
  • Laatst online: 14-07-2024

Rainmaker

RHCDS

Hoe ik dit meestal doe:

code:
1
2
3
4
5
6
#!/bin/bash
if ps -ef | grep -q snmp[d]; then
  echo "gevonden"
else
  echo "niet gevonden"
fi


Alleen de exit status van grep interesseert in dit geval, dus PIPESTATUS array gaan parsen is (lijkt mij) onnodig.

Daarnaast zou je (op Linux in ieder geval) eens kunnen kijken naar pidof, dan kan het nog korter:
code:
1
2
3
4
5
6
#!/bin/bash
if pidof snmpd; then
  echo "Ja, draait"
else
  echo "Draait niet"
fi


Wederom; opletten dat je niet tegen een alias / builtin aanloopt.

[ Voor 34% gewijzigd door Rainmaker op 02-04-2011 01:42 ]

We are pentium of borg. Division is futile. You will be approximated.


Acties:
  • 0 Henk 'm!

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

doe eens
Bash:
1
2
ps aux | grep snmpd | grep -vq grep
exit $?


Bij elk commando wordt $? ingevuld, als je er dus nog een echo tussen zet krijg je de exit status van de echo.

[ Voor 42% gewijzigd door H!GHGuY op 02-04-2011 07:43 ]

ASSUME makes an ASS out of U and ME


Acties:
  • 0 Henk 'm!

  • blaataaps
  • Registratie: Juli 2001
  • Niet online
Heeft het startupscript geen statuscommando?
Heeft freebsd geen pgrep?
Heef snmpd geen pidfile?

Alles beter dan met grep ps parsen lijkt me, helemaal als het ook nog eens niet werkt.

Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Rainmaker schreef op zaterdag 02 april 2011 @ 01:40:
Hoe ik dit meestal doe:

code:
1
2
3
4
5
6
#!/bin/bash
if ps -ef | grep -q snmp[d]; then
  echo "gevonden"
else
  echo "niet gevonden"
fi


Alleen de exit status van grep interesseert in dit geval, dus PIPESTATUS array gaan parsen is (lijkt mij) onnodig.
True, maar dat ging ik pas doen toen de exit status-methode faalde.
Daarnaast zou je (op Linux in ieder geval) eens kunnen kijken naar pidof, dan kan het nog korter:
Too bad, moet ook op fbsd draaien.
H!GHGuY schreef op zaterdag 02 april 2011 @ 07:41:
doe eens
Bash:
1
2
ps aux | grep snmpd | grep -vq grep
exit $?
Dit logt mijn shell uit :+.
Bij elk commando wordt $? ingevuld, als je er dus nog een echo tussen zet krijg je de exit status van de echo.
Dit is toch gewoon hoe een exit status werkt, of mis ik iets?
blaataaps schreef op zaterdag 02 april 2011 @ 09:47:
Heeft het startupscript geen statuscommando?
Nee, Welk startupscript? (inderdaad niet mijn server, maar ik mag het ook niet aanpassen).
Heeft freebsd geen pgrep?
Staat niet op die machine, en software op freebsd4 installeren is niet mijn hobby :X.
Heef snmpd geen pidfile?
snmpd crasht en de pid file blijft staan. Ipv fixen herstarten we gewoon de boel regelmatig :P
Alles beter dan met grep ps parsen lijkt me, helemaal als het ook nog eens niet werkt.
Jep. Weinig goede alternatieven so far...

i3 + moederbord + geheugen kopen?


Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 10:47

Kees

Serveradmin / BOFH / DoC
Boudewijn schreef op maandag 04 april 2011 @ 14:31:
[...]

snmpd crasht en de pid file blijft staan. Ipv fixen herstarten we gewoon de boel regelmatig :P
in psuedocode:
if dir-exists /proc/`cat $pidfile` do nothing
else restart snmp

is dat geen oplossing?

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Acties:
  • 0 Henk 'm!

  • JohnR
  • Registratie: April 2003
  • Niet online

JohnR

Koffie is lekker!

Kees schreef op maandag 04 april 2011 @ 14:48:
[...]

in psuedocode:
if dir-exists /proc/`cat $pidfile` do nothing
else restart snmp

is dat geen oplossing?
FreeBSD heeft lang niet altijd een procfs.
if [ ! "ps aux `cat /var/run/snmpd.pid`" ];then restart snmpd

/(bb|[^b]{2})/


Acties:
  • 0 Henk 'm!

  • Big Mama
  • Registratie: Mei 2000
  • Laatst online: 09:11
code:
1
2
3
4
5
#!/bin/bash
ps aux | grep snmpd | grep -vq grep
echo ${PIPESTATUS[0]}${PIPESTATUS[1]}${PIPESTATUS[2]}${PIPESTATUS[3]}${PIPESTATUS[4]}
echo $?
exit

De exitcode die je opvraagt in regel 4, is de exitcode van het commando echo uit regel 3.


code:
1
2
3
4
#!/bin/bash
ps aux | grep snmpd | grep -vq grep
echo $?
exit


Als je de grepjes omdraait gaat het wel goed:
code:
1
ps aux | grep -v grep | grep -q snmpd

[ Voor 26% gewijzigd door Big Mama op 04-04-2011 19:36 ]

Computers follow your orders, not your intentions.


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Big Mama schreef op maandag 04 april 2011 @ 19:30:
code:
1
2
3
4
5
#!/bin/bash
ps aux | grep snmpd | grep -vq grep
echo ${PIPESTATUS[0]}${PIPESTATUS[1]}${PIPESTATUS[2]}${PIPESTATUS[3]}${PIPESTATUS[4]}
echo $?
exit

De exitcode die je opvraagt in regel 4, is de exitcode van het commando echo uit regel 3.
Miscommunicatie, ik heb in mijn startpost gezegd dat ik een van de commando's gebruik. Maw: ik gebruik 1 van de 2, uiteraard niet allebei.
Ik begreep dat je met PIPESTATUS exitcodes van delen van pipes kon krijgen, en dacht dat het wel duidelijk zou zijn dat ik niet beide echo's tegelijk zou gebruiken.
code:
1
2
3
4
#!/bin/bash
ps aux | grep snmpd | grep -vq grep
echo $?
exit


Als je de grepjes omdraait gaat het wel goed:
code:
1
ps aux | grep -v grep | grep -q snmpd
INteressant, edoch waarom werkt het anders in de shell dan in een script?

i3 + moederbord + geheugen kopen?


Acties:
  • 0 Henk 'm!

  • CyBeR
  • Registratie: September 2001
  • Niet online

CyBeR

💩

Gebruik je wellicht interactief een andere shell? Bij mij is de uitkomst namelijk hetzelfde:


marco@mysql01:/tmp$ cat test.sh 
#!/bin/bash
ps aux | grep snmpd | grep -vq grep
echo $?
exit
marco@mysql01:/tmp$ ./test.sh 
0
marco@mysql01:/tmp$ ps aux | grep snmpd | grep -vq grep; echo $?
0
marco@mysql01:/tmp$ ps aux | grep -v grep | grep -q snmpd; echo $?
0


(Voor de volledigheid: dit evalueert allemaal naar 'true'; ik heb uiteraard ook snmpd draaien).

Verder: heb je wel dezelfde grep als wij? Je zegt freebsd, waar ik je bijna kan garanderen dat wij allemaal linux (en dus GNU Grep) hebben, wellicht op Big Mama na. Probeer 'ggrep' eens. Wellicht heeft die een andere exit status bij -vq.

Kijk voor de gein ook eens of je niet een andere variant van ps uitvoert als je 't in een script hebt. BSD ps wil 'aux' nog wel 's niet accepteren en '-ef' willen.

[ Voor 40% gewijzigd door CyBeR op 05-04-2011 01:48 ]

All my posts are provided as-is. They come with NO WARRANTY at all.


Acties:
  • 0 Henk 'm!

  • Boudewijn
  • Registratie: Februari 2004
  • Niet online

Boudewijn

omdat het kan

Topicstarter
Hoi Cyber,

Nou ja het script draait op een antieke Linux machine (FC3, don't ask :X) en een antieke fbsd machine.

Daar wil men geen tijd meer in steken qua updates (al sinds de steentijd).
Interactief gebruik ik bash (/bin/bash aldus /etc/passwd) en in mijn script ook, als in: ik definieer hem netjes met de hash-bang. Op fbsd hetzelfde verhaal alleen is het dan /usr/local/bin/bash .


Het testen van het script is momenteel zowel op Linux als BSD, maar als ik het voor Linux werkend krijg maak ik wel even via een if-constructie op de uname een alternatieve ps :).

ps aux versus ps ef ken ik ja, dus als ik net aux heb genoemd hier komt dat van mijn Linux bak af.

i3 + moederbord + geheugen kopen?

Pagina: 1