synology bash script

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • StarWing
  • Registratie: Januari 2003
  • Laatst online: 04:47
Ik wil graag een script in elkaar knutselen op mijn syno.
De bedoeling is dat er een process gecontroleerd wordt, en indien het afgelopen is, een volgende actie doet.

De opzet is om:
VPN starten naar backup syno
backup starten
while loop lopen tot de backup afgelopen is
vpn disconnecten.

Ik ben al zover dat ik punt 1 en 2 heb, punt 4 lukt ook wel, maar ik zit wat te sukkelen met de while loop in unix.

Script tem punt 2:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
if echo `ifconfig` | grep -q "ppp"
then
echo "VPN already up"
else
echo "starting VPN"
touch /usr/syno/etc/synovpnclient/vpnc_connecting
echo "conf_id=l1406271443" >/usr/syno/etc/synovpnclient/vpnc_connecting
echo "conf_name=VpnNaam" >>/usr/syno/etc/synovpnclient/vpnc_connecting
echo "proto=l2tp" >>vpnc_connecting
synovpnc reconnect --protocol=l2tp --name=VpnNaam --retry=5
fi

/usr/syno/bin/synobackup --backup 1/


het commando dat moet controleren of de backup lopende is:
`ps` | grep -q "backup_balullah"

Dit werkt, maar zonder loop:
code:
1
2
3
4
5
6
if echo `ps` | grep -q "backup_balullah"
then
echo "Running"
else
echo "Done"
fi


Nu is de vraag hoe ik dit in een loop moet gieten. Onder cmd zou ik dit doen met goto statements, maar die werken niet in bash :X

Ik heb al wat zitten proberen met while true loops, maar ik slaag er maar niet in om de goeie syntax te vinden.

Page intentionally left blank.


Acties:
  • 0 Henk 'm!

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

ripperke

w00t!

Meest ideale zou zijn dat je je backup_ballullah process in de foreground laat draaien. Dus kijk eerst eens of er een optie is omdat in foreground te laten?

Anders kan je inderdaad volgend loopje gebruiken
code:
1
2
3
4
while pgrep backup_balullah &> /dev/null
do 
    sleep 1
done


Moest je geen pgrep hebben kan je dat vervangen door
code:
1
ps -ef |grep [b]ackup_balullah

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


Acties:
  • 0 Henk 'm!

  • Hero of Time
  • Registratie: Oktober 2004
  • Laatst online: 21:30

Hero of Time

Moderator LNX

There is only one Legend

In een script worden commando's sequentieel uitgevoerd. Als je backup via rsync laat lopen bijvoorbeeld gaat je script pas naar de volgende regel als rsync klaar is. Dus in feite is het niet meer dan dit:
Bash:
1
2
3
4
#!/bin/bash
vpn-connect
rsync $meuk $doel
vpn-disconnect


Wil je een idee als 'goto' gebruiken, dan maak je aan het begin van je script functies die je later aanroept. Dat aanroepen gaat zo simpel als 'functie', waarbij je iets simpels voor je VPN op deze manier kan maken:
Bash:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
vpn () {
case $1 in
    open)
        code voor verbinding maken
        ;;
    close)
        sluit verbinding
        ;;
esac
}

vpn open
do_backup
vpn close

En zo kan je meer spelen met functies e.d.

Zoals eerder gezegd, en hierboven, is het makkelijker om je backup in de voorgrond te laten draaien. Als dat niet kan, zit je idd met een while loop. Omdat het greppen op een proces dat je weergeeft met ps niet altijd het gewenste resultaat geeft, is het beter om grep zelf te excluden van je weergave:
code:
1
ps ax | grep proces | grep -v grep

Om dan te checken met het volgende:
code:
1
2
3
while [ `ps -ax | grep proces | grep -v grep | wc-l` -eq 1 ] ; do
    sleep 5 # wacht 5 seconde, is beter voor je resources dan gelijk weer controleren
done

Commandline FTW | Tweakt met mate


Acties:
  • 0 Henk 'm!

  • StarWing
  • Registratie: Januari 2003
  • Laatst online: 04:47
Bedankt voor de antwoorden.
Ondertussen heb ik een manier gevonden, voor de volledigheid het scriptje. Let wel, geen error meldingen oid, gewoon sequentieel uitvoeren:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if echo `ifconfig` | grep -q "ppp"
then
echo "VPN already up"
else
echo "starting VPN"
touch /usr/syno/etc/synovpnclient/vpnc_connecting
echo "conf_id=l1406271443" >/usr/syno/etc/synovpnclient/vpnc_connecting
echo "conf_name=VpnNameInGui" >>/usr/syno/etc/synovpnclient/vpnc_connecting
echo "proto=l2tp" >>vpnc_connecting
synovpnc reconnect --protocol=l2tp --name=VpnNameInGui --retry=5
fi
sleep 10s
echo "starting backup"
synonetbkp --rsync backupjob
wait
echo "Backup Done"

echo "killing client"
synovpnc kill_client

Page intentionally left blank.


Acties:
  • 0 Henk 'm!

Verwijderd

De manier van commando output voeren aan grep is wat raar:
normaliter kan je ook gewoon regel 1 vervangen door:
code:
1
if ifconfig | greq -q "ppp"


edit:
Nog mooier zou zijn om ifconfig specifiek om de ppp interface te vragen en dus regel 1 te vervangen door:
code:
1
if ifconfig ppp

Nu krijg je wel wat rotzooi op je scherm omdat hij gaat klagen als hij het niet gevonden heeft en informatie gaat geven als hij de ppp interface wel kan vinden maar dat kan je voorkomen met IO redirects:
code:
1
if ifconfig ppp 1>/dev/null 2>&1


edit2:
Mijn laatstgenoemde voorbeeld is ook nog eens stabieler, stel dat er op een andere plek dan het interface de string "ppp" in de output van ifconfig staat dan zegt grep dat hij hem gevonden heeft terwijl je dat niet wil.
Dit kan je ook voorkomen door grep te vertellen dat je specifiek wil matchen op "ppp" aan het begin van een regel, dan zou regel 1 worden:
code:
1
if ifconfig | grep -q "^ppp"

[ Voor 83% gewijzigd door Verwijderd op 28-07-2014 15:36 . Reden: extra info ]