Veta när en fil är klar för användning?

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

Jag håller på att skriva ett shellscript... inget svårt men ändock stöter jag på lite problem.
Förenklat handlar det om att flytta filer från en mapp1 till mapp2.
Men jag kan inte flytta filen förren den är färdig kopierad till mapp1.

Finns det något sätt där jag kan läsa av när filen är klar att kopiera?
Jag kommer aldrig veta hur stor filen är som kommer.
Belastningen på scriptet kommer vara stor när det väl är klart.

Det måste väl finnas någon flagga att läsa av på något sätt.

Någon som kan hjälpa mig?

  • Medlem
  • International user
  • 2007-01-19 08:32

Det säkraste är att kontrollera att filen inte växer längre. Har detta på ett antal funktioner med shellscript. Har tidigare letat efter "flaggor" men det har aldrig fungerat pålitligt.

Du får hemskt gärna visa hur det ser ut.

  • Medlem
  • International user
  • 2007-01-19 09:00

Principen bygger på att man kontrollerar filstorleken med t.ex.

ls -l testfil | cut -d" " -f9

väntar en tid (t.ex. 2 sekunder) beroende på funktion och kontrollerar filstorleken på nytt. Har ingen förändring skett under den tiden så kan filen förväntas vara färdigskriven.

Vi har detta till att flytta tusentals filer mellan mappar per vecka utan något problem.

Låter verkligen perfekt. Jag ska testa detta.
Om du vill får du ge mig scriptet.

  • Medlem
  • Stockholm
  • 2007-01-19 10:23
Ursprungligen av Mattias Hedman:

Men jag kan inte flytta filen förren den är färdig kopierad till mapp1.

Jo, om mapp1 och mapp2 är i samma filsystem så kan du flytta filen med mv innan den är färdigskriven.

Ursprungligen av Mattias Hedman:

Finns det något sätt där jag kan läsa av när filen är klar att kopiera?

Fast nu säger du kopiera ???

Det har hela tiden handlat om att flytta ingen annat.

Men om mapp2 är en s.k. hotfolder för ett annat program (i detta fall ProScript) jag vet inte exakt hur ProScript plockar upp sina filer men om den plockar upp en icke färdig fil kommer det bli problem.

  • Medlem
  • Stockholm
  • 2007-01-19 11:30
Ursprungligen av Mattias Hedman:

Men om mapp2 är en s.k. hotfolder för ett annat program...

Nej, då bör du inte göra mv för tidigt...

Man kan enkelt få en storlek på en fil genom (bra i scripts):

stat -f "%z" din.fil

Fast hellre än att polla på storlek (som känns lite äventyrligt) så skulle jag undersöka den process som skapar filen. Kan du få den att markera (t.ex. göra touch på en kontrollfil) att den är klar? Finns det en PID du kan vänta på att den dör? Kan du få den att skriva på en pipe istället för en fil? Ifall du skapar en pipe med ett namn i en mapp?

  • Medlem
  • International user
  • 2007-01-19 11:42
Ursprungligen av pesc:

....

Fast hellre än att polla på storlek (som känns lite äventyrligt) så skulle jag undersöka den process som skapar filen. Kan du få den att markera (t.ex. göra touch på en kontrollfil) att den är klar? Finns det en PID du kan vänta på att den dör? Kan du få den att skriva på en pipe istället för en fil? Ifall du skapar en pipe med ett namn i en mapp?

Poscript kan tyvärr inget av detta. Bästa sättet är att kontrollera filstorleken, "file grow". Proscript själv använder denna teknik internt för kontroll av filer i sina hotfolders.

Ursprungligen av Mattias Hedman:

Det har hela tiden handlat om att flytta ingen annat.

Det kan vara smart ur Q&A-synpunkt att kopiera och sedan, när kopieringen är klar, radera filen.

Okej pesc du passerade just mina kunskaper i shell scripting och UNIX kunskap...

Ursprungligen av Mattias Hedman:

Jag håller på att skriva ett shellscript... inget svårt men ändock stöter jag på lite problem.
Förenklat handlar det om att flytta filer från en mapp1 till mapp2.
Men jag kan inte flytta filen förren den är färdig kopierad till mapp1.

Finns det något sätt där jag kan läsa av när filen är klar att kopiera?
Jag kommer aldrig veta hur stor filen är som kommer.
Belastningen på scriptet kommer vara stor när det väl är klart.

Det måste väl finnas någon flagga att läsa av på något sätt.

Någon som kan hjälpa mig?

Det är väl bara att i all enkelhet kolla om processen som utför kopieringen släppt taget om filen? Eller är jag fel ute? Antingen tar du reda på vilket process-ID processen har och kollar samtliga filer den processen har öppnat:

lsof -p PID

eller så går du från motsatta hållet och kollar vilka processer som har filen öppen:

lsof /sökväg/till/fil

Ett bra knep man kan ta till är att lsof returnerar 0 om filen används av minst en process men 1 om den inte används alls. Det kan du använda i if-satser eller med &&- och ||-operatorerna. Dock är det inte direkt skottsäkert eftersom 1 ju också returneras i händelse av fel, men under kontrollerade omständigheter kan det vara användbart.

Måste det vara Shell Script? Det finns ett fint litet specialhack i AppleScript som fungerar bättre än de flesta andra metoder jag känner till.

Oh nej det måste inte vara shell script.
Men det är det jag jag lite av AppleScript kan jag bara stava till inget mer.

  • Medlem
  • Gävle
  • 2007-01-22 08:58

I princip fungerar det på samma sätt i Applescript, den kolla storleken på filen med jämna mellanrum. Hade ett eminent script som jag använde för att flytta filer på datorn med. Men efter en formatering försvann dom

Ursprungligen av Creops:

I princip fungerar det på samma sätt i Applescript, den kolla storleken på filen med jämna mellanrum. Hade ett eminent script som jag använde för att flytta filer på datorn med. Men efter en formatering försvann dom

Det är tyvärr ett dåligt sätt både vad gäller AppleScript och ShellScript, framför allt om man talar om filöverföring t.ex. via ftp /http etc, där fluktuationer i nätverkstrafiken kan få filstorleken att stå still.

  • Medlem
  • 2007-01-22 20:21
Ursprungligen av Creops:

I princip fungerar det på samma sätt i Applescript, den kolla storleken på filen med jämna mellanrum. Hade ett eminent script som jag använde för att flytta filer på datorn med. Men efter en formatering försvann dom

Med AppleScript kan man också testa att öppna filen för att skriva i den. Om det misslyckas är filen upptagen, om det lyckas är den ledig, dvs i detta fall färdigkopierad.

try
	open for access theFile with write permission
	close access result
	return false
on error
	return true
end try

Precis så.

Ursprungligen av wlao:

Med AppleScript kan man också testa att öppna filen för att skriva i den. Om det misslyckas är filen upptagen, om det lyckas är den ledig, dvs i detta fall färdigkopierad.

try
	open for access theFile with write permission
	close access result
	return false
on error
	return true
end try
1
Bevaka tråden