Wykonanie programu przez skrypt bash

Wykonanie programu przez skrypt bash
CR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 64
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:

Kopiuj
#!/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"?

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0
Kopiuj
"$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).

CR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 64
0

... spowoduje uruchomienie programu w $1.

nie do konca rozumiem co chcecie mi przekazac

CR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 64
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?

Silv
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
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.

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

nie do konca rozumiem co chcecie mi przekazac

Kopiuj
#!/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.

CR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 64
0
Kopiuj
#!/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?

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
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).

CR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 64
0

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

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
1

Co to znaczy jak należy?

PerlMonk
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa 🐪
  • Postów: 1719
0

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

Kopiuj
#!/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

Kopiuj
  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.

hauleth
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Kopiuj
#!/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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.