watchdog softowy w skrypcie w bashu

Odpowiedz Nowy wątek
2017-10-19 15:45
Darek_Pach
0

Hej
Jestem poczatkujacy jeśli chodzi o basha. Mam problem z poniższym skryptem. Wywala mi się na linii 8 i 10.
Dla linii 8 mamy: }": command not found
Dla linii 10 mamy: [: : integer expression expected
Jeżeli wie ktoś jak zmodyfikować poniższe aby poprawić te błędy to prosze o pomoc.
Cel skryptu to w nieskończonej pętli while po nazwach procesów (które są odpalane wcześniej po starcie linuxie przez inny skrypt w user spejsie) znaleźć pid.
Jeżeli pid nie istnieje (-1) to zrobić reboota linuxa.
Docelowo miało być otwarcie /dev/watchdog przed pętlą while i brak zapisu do watchdoga gdy nie znajdzie pida co spowoduje też restart, ale nie wiem jak w bashu kominikowac się z kernel spejcem. W C++ mamy ioctl. Totez zostałem przy prostszej wersji z rebootem linuxa.

#!/bin/bash

SERVICES=('tail' 'tail')

while true
do
    for SERVICE in "${SERVICES[@]}"; do
        var="ps -A | grep '${SERVICE}' | awk '{print $1}'"     #linia 8

        if [ "$var" -eq "-1" ]; then     #linia 10
                echo "${SERVICE} not found in process list, system will be rebooted"
                reboot
        fi
    done

    sleep 5
done

exit 0

Pozostało 580 znaków

2017-10-20 11:20
0

Jak chcesz przypisać wynik potoku do zmiennej, to używasz odwróconych apostrofów. Ujęcie potoku w cudzysłów powodowało błędy. Przerobiłem nieco program:

#!/usr/bin/env bash

SERVICES=( 'watchdog' 'tail' )

while true
do
    for SERVICE in "${SERVICES[@]}"
    do
        counter=`ps -A | grep "${SERVICE}" -c`

        if [ $counter -ne 0 ]
        then
            var=`ps -A | grep "${SERVICE}" -m 1 | awk '{print $1}'`
            echo "$SERVICE -> pid=$var"
        else
            echo "${SERVICE} not found in process list, system will be rebooted"
            exit # reboot
        fi
    done

    sleep 1
done

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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