Wykonanie programu przez skrypt bash

0

Napisz skrypt, który będzie sprawdzał czy jest uruchomiony program,
którego nazwa podawana jest jako parametr tego skryptu. Jeżeli program
działa, to skrypt nie podejmie żadnej akcji, jeżeli nie, skrypt powinien
uruchomić ten program i zapisać każdorazowo datę i godzinę
uruchomienia w pliku logu.

udalo mi sie napisac cos takiego:

#!/bin/bash
if pgrep -x "$1" > /dev/null
then
  echo "Running - nie podejmuje zadnej akcji."
else
  echo "Stopped"
  cat $1
fi

jak uruchomic ten program i zapisac date w "pliku logu"?

0
"$1"

... spowoduje uruchomienie programu w $1.

Wpis do logu możesz dodać z wykorzystaniem echo oraz operatora >>.

Btw, #!/usr/bin/env bash jest bardziej uniwersalny (patrz: https://en.wikipedia.org/wiki/Shebang_(Unix)#Portability; Twój shebang nie zadziała np. na NixOS).

0

... spowoduje uruchomienie programu w $1.

nie do konca rozumiem co chcecie mi przekazac

0

czyli jesli chodzi o moje rozumowanie z cat $1 - jest bledne
a co do wpisu dodac go uzywajac "echo >> " a jak zapisac tam date? date -u?

0

Co do uruchomienia, to nie wiem, co @Patryk27 miał na myśli. Z pgrep nie powinno się tak zdarzyć, o ile rozumiem jego man page.

W każdym razie to cat $1 spowoduje wypisanie "tekstu" pliku programu (najpewniej danych binarnych) na standardowe wyjście. Chyba nie o to chodziło.

0

nie do konca rozumiem co chcecie mi przekazac

#!/usr/bin/env bash

if pgrep -x "$1" > /dev/null
then
  echo "Running - nie podejmuje zadnej akcji."
else
  echo "Stopped"
  "$1"
  echo $(tutaj komenda do daty) >> log.log
fi

Ewentualnie "$1" & aby uruchomić program w tle, jeśli sam się nie daemonizuje.

0
#!/usr/bin/env bash

if pgrep -x "$1" > /dev/null
then
  echo "Running - nie podejmuje zadnej akcji."
else
  echo "Stopped"
  "$1"
  echo $date -u >> log.log
fi

czyli finalny kod wygladalby mniej wiecej tak?

1

$(date -u) - nawiasy są istotne, ponieważ wskazują dokładny początek oraz koniec polecenia, które zostanie uruchomione (also: https://stackoverflow.com/questions/39110485/difference-between-and-in-bash).

0

a teraz dosc banalne pytanie, jak sprawdzic czy ten program dziala jak nalezy?

1

Co to znaczy jak należy?

0

Żeby pobrać numer ostatniego procesu uruchumionego w tle wykorzystujemy zmienną $!. Na przykład tak:

#!/bin/bash


./program &
numerek=$!

echo "Numer wystartowanego procesu ${numerek}"

czyProcesBiegnie=`ps a | grep -P "^\s+${numerek}\s+"`

if [[ "${czyProcesBiegnie}" = "" ]]; then
	echo "Proces NIE BIEGNIE!!!"
else
	echo "Proces biegnie"
fi

Polecenie grep zostało tu użyte do sprawdzenia czy uruchomiony przez nas proces dalej działa. Jeśli jednak program dało się uruchomić, ale zaraz się on zakończy, będziemy mieli tylko jego numer przy starcie, ale grep go nie znajdzie. To przy okazji sprawdzenie czy serwer się nie wysypał. Polecam się upewnić czy ps jest w stanie drukować wyniki w stylu

  PID TTY      STAT   TIME COMMAND
  742 tty1     Ss+    0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
  792 tty7     Rsl+   1:31 /usr/lib/xorg/Xorg -nolisten tcp -auth /var/run/sddm/{dfc2d5d4-33b1-4f61-a875-42c79e4663c6} -background none -noreset -displayfd 17 -seat seat0 vt7
 2634 pts/1    Ss     0:00 /bin/bash

To dość ważne ze względu na formatowanie. Na początku możemy mieć spacje, stąd ^\s+ w wyrażeniu regularnym.

0

Najprościej (i wg mnie najlepiej) to dać pro prostu:

#!/bin/bash
if pgrep -x "$1" > /dev/null
then
  syslog -s -l Info "Running - nie podejmuje zadnej akcji."
else
  syslog -s -l Info "Stopped"
fi

Zapisane będzie w pliku, do którego pisze syslog, data też będzie domyślnie dodana.

1 użytkowników online, w tym zalogowanych: 0, gości: 1