shellscript hjälp:

Tråden skapades och har fått 20 svar. Det senaste inlägget skrevs .
1

Jag har skrivit ett shellscript som ska montera en servervolym (om den inte redan är det), skapa en mapp lokalt (om den inte redan finns) synka servermappen med den lokala mappen. Koppla ner monteringen ifall scriptet monterade den och sedan avsluta sig själv.

När jag kör detta script manuellt fungerar det och det är bara en sak jag inte fått bort och det är ett meddelande när jag skapar den lokala mappen att den redan finns men varför jag kommer dit fattar jag inte eftersom jag kollar om den redan finns med en if-sats.
Så det är problem nr 1.

Problem nr 2 är att om jag kör detta script med cron så fungerar det inte alls...

#!/bin/bash

if [ ! -d /Volumes/server ]; then
	mkdir /Volumes/server
   	mount_afp afp://admin:password@server.domän.nu/Volym /Volumes/Server
   	opi="1"
    disktool -r
fi

if [ ! -d /Users/$LOGNAME/Lokalmapp ]; then
	mkdir /Users/$LOGNAME/Lokalmapp
fi

rsync -rupog --delete --force -E /Volumes/Server/Servermapp/ /Users/$LOGNAME/Lokalmapp

if [ "$opi" = "1" ]; then
	umount /Volumes/Server
fi

exit 0


Är det någon som kan förklara/rätt mitt script?

Förstår inte din första fråga, förklara närmare.

När du kör den i ett cron-jobb, kör du den som root eller för varje användare? Kanske bättre att lägga in den som loginscript för varje användare och loppa den i oändlighet (så det blir en demon istället)? På detta sätt körs scriptet som användaren.

Loopar brukar jag göra så här:

while [ true ];
do
    din kod här               
    sleep 30         
done &

När jag kör scriptet får jag meddelandet "Directory already exists" det vill jag ha bort.
Det är kodsnutten:

if [ ! -d /Users/$LOGNAME/Lokalmapp ]; then
	mkdir /Users/$LOGNAME/Lokalmapp
fi

Som producerar det. Ska jag hellre skriva denna del så här?

while [ ! -d /Users/$LOGNAME/Lokalmapp ]
do
mkdir /Users/$LOGNAME/Lokalmapp
sleep 30
done &

Det jag gör att att kolla OM DEN INTE FINNS gör så här.

Jag har testat att köra scriptet som root och användare ingen skillnad.
Scriptet körs inte alls den tidpunkt jag satt.
Får bara en massa fel typ varenda rad...

  • Medlem
  • Stockholm
  • 2007-03-12 11:13

Varför kör du inte rsync genom en ssh-tunnel och schemalägger det med launchd eller cron? Du verkar ju ha rättigheter verkar det som...

Jag har fullständiga rättigheter när det gäller detta så jag kan göra precis som jag vill.
Bara det funkar.
Men vad menar du med ssh-tunnel? Varför det internt?
Launchd kan jag inte alls så visa gärna.

  • Medlem
  • Umeå
  • 2007-03-12 11:24

Du inte konsekvent med stora respektive små bokstäver i dina sökvägar..

Sen så mountar du bara nätverks mappen om den INTE finns i /Volumes, du gör inget alls om den redan finns.

Det kan bero på att jag har anonymiserat skriptet innan jag publicerade det här.

Exakt. Volymen ingår i de flesta användares standrad uppkoppling så då behöver jag inte koppla upp den. Samma sak med mapp-skapandet.
Den ska bara skapas om mappen inte redan finns.

Lunch nu därför lite hastigt svar (maten kallnar)

while [ true ]; # Loopa i all evighet istället för att använda cron
do
    if [ ! -d "/Users/$LOGNAME/Lokalmapp" ]; then # Finns inte mappen?
        mkdir -p "/Users/$LOGNAME/Lokalmapp" # Skapa den!
    else
        # Vad vill vi göra om mappen finns?
    fi
  sleep 30 # Vänta i 30 sekunder innan vi kör hela proceduren igen
done &

Exempel på hur jag gjort en egen AutoMount eftersom jag inte gilar Startobjekt

http://grafisktforum.org/showthread.php?t=17801

  • Medlem
  • Umeå
  • 2007-03-12 11:43

I vilket fall som helst så verkar det inte vara något fel i själva scriptet, det fungerar för ig om jag kör det manuellt, utan några felmeddelanden alls.

Ursprungligen av Narogh:

I vilket fall som helst så verkar det inte vara något fel i själva scriptet, det fungerar för ig om jag kör det manuellt, utan några felmeddelanden alls.

Haft tanken att problemet ligger i $LOGNAME.

Hur kommer det sig att felet ligger i $LOGNAME? Är inte det en systemvariabel?

DeeJam ska testa att göra som du skriver så får vi se.

Posta dom felmeddelanden du får också.

Nu har jag testat att skriva om skriptet enl DeeJams förslag. Nu får jag ett felmeddelande jag inte fått förut.

#!/bin/bash

while [ true ];
do

	if [ ! -d /Volumes/OPI\ NT ]; then
		mkdir -p /Volumes/OPI\ NT
	   	mount_afp afp://user:password@10.10.0.7/OPI NT /Volumes/OPI\ NT
	   	opi="1"
	    disktool -r
	fi

    if [ ! -d "/Users/$LOGNAME/Mapp" ]; then 
        mkdir -p "/Users/$LOGNAME/Mapp" 
    else
        rsync -rupog --delete --force -E /Volumes/OPI\ NT/Mapp/ /Users/$LOGNAME/Mapp
    fi

	if [ "$opi" = "1" ]; then
		umount /Volumes/OPI\ NT
	fi
	
	sleep 30 # Vänta i 30 sekunder innan vi kör hela proceduren igen

done &

Felmeddelandet:
mount_afp: AFPMountURL returned error 22, errno is 2

Jag har testat att logga på server med de uppgifter jag har och det fungerar men inte skript vägen. Hur kan det komma sig?

Har testat att köra både som root och användare – ingen skillnad.

  • Medlem
  • Umeå
  • 2007-03-13 09:52

Förutom att det saknas ett "\" i den här raden så..

mount_afp afp://user:password@10.10.0.7/OPI NT /Volumes/OPI\ NT

skal vara

mount_afp afp://user:password@10.10.0.7/OPI\ NT /Volumes/OPI\ NT

Tips för att undvika sådana små missar är att ALDRIG ha mellanslag i katalognamnen.

Jo detta med mellanslag vet vi som har en aning om unix om... värre är det med dem som bara kan Windows...

Ahhh det var bara \ som saknades nu är skriptet igång och synkar för fullt.

Hmmm nu uppkommer andra problem.

I skriptet loggar jag in på OPI NT som mig själv. Det är inte så bra eftersom jag är administratör.
Frågan är hur jag ska starta detta skript på klienterna, de som kommer ha skriptet är alla uppkopplade mot OPI NT redan.

Hur försäkrar jag mig att skriptet dras igång "sent" alltså efter det användaren loggat in mot OPI NT. Det bästa vore om jag skriptet kunde starta när OPI NT finns.
Jag tror jag har en idé om hur jag ska göra det... återkommer med alla fel.

Sedan vill jag styra om alla output till en loggfil.

  • Medlem
  • Umeå
  • 2007-03-13 10:39

Det enklaste vor väl att kolla om en underkatalog i den monterade servermappen är tillgänglig eller inte, om den är det så får scriptet köras annars inte.

Om du kikar här kan du ng få några idéer. http://tech.inhelsinki.nl/locationchanger/

Intressant ska jag ta och titta på efter lunch...
Jag testade att lägga hela scriptet inom en while; det fungerar inte.
Så jag testar detta. Men sedan.

Nu har jag fixat till skriptet så att det dels mer fungerar som en Deamon och att det inte körs förren serverenheten är monterad.

#!/bin/bash

# Version 2.0 Omskrivning av scriptet från scratch.
# Version 2.1 Skriptet körs inte förren OPI NT finns monterad.

exec 1>/dev/null 2>/dev/null

sleep 2

while [ true ];
	do

	if [ -d /Volumes/OPI\ NT ]; then

		if [ ! -d "/Users/$LOGNAME/Mapp" ]; then 
				mkdir -p "/Users/$LOGNAME/Mapp" 
			else
				rsync -rupog --delete --force -E /Volumes/OPI\ NT/Mapp/ /Users/$LOGNAME/Mapp
		fi

	fi

	sleep 30

done &

Tack för all hjälp!

Vassego!

Hjälp!
Skriptet ovan fungerade så vackert i mars men nu när det ska köras i gång i större skala har det slutat att fungera. Inga förändringar är gjorda.
Inget händer när jag kör skriptet.

Mummel jodå det händer saker... jag hade lite bråttom bara.
Jag upptäckte även att mina rysnc flaggor kanske inte var det bästa så de har jag ändrat.
Även flyttat ut skapandet av Typsnittsmappen utanför while-lopen.

Men nästa fråga är nu: när jag tittar på antalet processer har jag tre (3) rsync processer igång varför? Hur får jag ner det till en?

1
Bevaka tråden