2017-12-07 4 views
0

Ich versuche, die Zeit für den Prozessstart zu bekommen. Normalerweise verwende ich die Klammern für den ersten Buchstaben des Prozesses, den ich verwende. Es nimmt die Selbstberichterstattung "Grep" in der PS-Ausgabe.Brackets [] um String mit grep und ps - ef

#!/bin/bash 

set -x 
restarTXG="sendevent -E FORCE_STARTJOB -J CASPERRT_CD_TXG_DR_STR_PS" 
bounceTXG="sendevent -E FORCE_STARTJOB -J CASPERRT_CD_TXG_DR_STP_PS; sleep 10 ; sendevent -E FORCE_STARTJOB -J CASPERRT_CD_TXG_DR_STR_PS" 
timeofTXG=$(ps -ef | grep [t]xg | awk '{print $5}') 

if [ -n "$timeofTXG" ] ; then 
    printf "%s\n" "The TXG_DR is ON as of $timeofTXG" 
else 
    printf "%s\n" "'The TXG_DR is OFF" 
fi 

18:40 ist die Zeit, die ich das Prüfskript ausführen. 17:44 Uhr ist der Zeitpunkt, zu dem der Prozess begann.

++ ps -ef 
++ grep '[t]xg' 
++ awk '{print $5}' 
+ timeofTXG='17:44 
18:40 
18:40' 
+ '[' -n '17:44 
18:40 
18:40' ']' 
+ printf '%s\n' 'The TXG_DR is ON as of 17:44 
18:40 
18:40' 
The TXG_DR is ON as of 17:44 
18:40 
18:40 

Ich weiß nicht wirklich, wie die eckigen Klammern funktionieren. Wenn ich die ps von der Befehlszeile aus ausführen, funktionieren die Klammern [] - ps -ef | grep [t] xg | awk '{print $ 5}' aber im Zusammenhang mit dem Bash-Skript, sie arbeiten nicht, sie geben mir die Zeit des Selbstberichts grep. Wie funktionieren die Klammern? Warum funktionieren sie in der Befehlszeile und nicht im Skript? Wie entferne ich das selbst entlarvende Grep im Bash-Skript?

+6

Sie Zitate müssen von '[t] xg' zu verhindern, ersetzt mit 'txg' durch die Shell, wenn sich im aktuellen Verzeichnis eine Datei mit diesem Namen befindet. Das heißt, der Code sollte "[t] xg" lauten. –

+3

... oder, besser, grep 'ps' überhaupt nicht, aber verwenden Sie stattdessen ein Spezialwerkzeug wie' pgrep'. –

+2

Oder, noch besser, schauen Sie nicht einmal auf die Prozesstabelle, sondern schreiben Sie Ihre Software, um Advisory Locking oder das vom Betriebssystem bereitgestellte Prozessüberwachungssystem zu verwenden (systemd, runit, daemontools, upstart, launchd, was auch immer es sein mag). –

Antwort

1

Wenn Sie mit awk bereits Sie nicht grep brauchen, etwas tun (was ich denke, Ihre Absicht ist):

ps -ef | awk '$8 ~ /txg/ {print $5}' 
+0

Ich bin überhaupt nicht davon überzeugt, dass die Ausgabe von 'ps -ef' ausreichend gut definiert ist, um zu gewährleisten, dass die gewünschte Spalte (mit dem Namen der ausführbaren Datei) auf allen relevanten Plattformen '$ 8' ist. Ja, '-f' wird von POSIX garantiert, um eine" vollständige Liste "zu liefern, die eine bestimmte Menge von Feldern garantiert, aber den Inhalt jedes Feldes - und somit, ob' awk' es als ein Feld oder mehr als eins analysiert - ist die Implementierung definiert –

+0

@CharlesDuffy sehr wahr, aber die Absicht war zu zeigen, dass, wenn Sie "awk" in Ihrer Pipe haben Sie wahrscheinlich nicht brauchen 'grep' und es ist sicher mehr eingeschränkt als grepping die ganze Zeile. –