FLOCK(1) Användarkommandon FLOCK(1)

flock - hantera lås från skalskript

flock [flaggor] fil|katalog kommando [arguments]

flock [flaggor] fil|katalog -c kommando

flock [flaggor] nummer

Detta verktyg hanterar flock(2)-lås inifrån skalskript eller från kommandoraden.

Den första och andra av ovanstående former låser utförandet av ett kommando, på ett sätt som liknar su(1) eller newgrp(1). De låser en angiven fil eller katalog, som skapas (med lämpliga behörigheter) om den inte redan finns. Om låset inte kan förvärvas omedelbart väntar flock som standard tills låset är tillgängligt.

Den tredje formen använder en öppen fil med dess filbeskrivare nummer. Se exemplen nedan för hur det kan användas.

-c, --command kommando

Skicka ett enda kommando, utan argument, till skalet med -c.

-E, --conflict-exit-code nummer

Avslutningsstatus som används när flaggan -n används och det finns ett motstridigt lås, eller när flaggan -w används och tidsgränsen har uppnåtts. Standardvärdet är 1. nummer måste ligga inom intervallet 0 till 255.

-F, --no-fork

Gör ingen fork innan du utför kommando. När flock-processen exekveras ersätts den av kommando som fortsätter att hålla låset. Den här flaggan är inte kompatibelt med --close eftersom det annars inte skulle finnas något kvar att hålla låset.

-e, -x, --exclusive

Skaffa ett exklusivt lås, ibland kallat skrivlås. Detta är standardinställningen.

-n, --nb, --nonblocking

Misslyckas i stället för att vänta om låset inte kan förvärvas omedelbart. Se flaggan -E för den avslutsstatus som används.

-o, --close

Stäng filbeskrivaren som låset hålls på innan du utför kommando. Detta är användbart om kommando startar en underordnad process som inte bör hålla låset.

-s, --shared

Få ett delat lås, ibland kallat ett läslås.

-u, --unlock

Släpp ett lås. Detta är vanligtvis inte nödvändigt, eftersom ett lås automatiskt släpps när filen stängs. Det kan dock krävas i särskilda fall, t.ex. om den bifogade kommandogruppen kan ha förgrenat en bakgrundsprocess som inte borde hålla låset.

-w, --wait, --timeout seconds

Misslyckas om låset inte kan förvärvas inom sekunder. Decimala fraktionerade värden är tillåtna. Se flaggan -E för den avslutsstatus som används. Noll antal sekunder tolkas som --nonblock.

--fcntl

Instead of flock(2), apply an fcntl(2) open file description lock (that is, using the F_OFD_SETLK (non-blocking) or F_OFD_SETLKW (blocking) commands). These locks are independent of those applied via flock(2), but, unlike traditional POSIX fcntl(2) locks (F_SETLK, F_SETLKW), have semantics matching those of flock(2).

Detta är endast tillgängligt för kärnversioner >= 3.15.

--start offset

The starting offset for lock. This option implies --fcntl.

--length number

The number of bytes to lock. This option implies --fcntl.

--verbose

Rapportera hur lång tid det tog att skaffa låset eller varför låset inte kunde skaffas.

-h, --help

Visa hjälptext och avsluta.

-V, --version

Visa version och avsluta.

Kommandot använder <sysexits.h> utgångsstatusvärden för allt, utom när något av flaggorna -n eller -w används, som rapporterar ett misslyckande med att förvärva låset med en utgångsstatus som anges av flaggan -E, eller 1 som standard. Utgångsstatusen som ges av -E måste ligga inom intervallet 0 till 255.

När kommando-varianten används och det underordnade kommandot utförs, är utgångsstatusen den som gäller för det underordnade kommandot.

flock upptäcker inte deadlock. Se flock(2) för mer information.

Vissa filsystem (t.ex. NFS och CIFS) har en begränsad implementering av flock(2) och flock kan alltid misslyckas. För detaljer se flock(2), nfs(5) och mount.cifs(8). Beroende på monterinsflaggor kan flock alltid misslyckas där.

Observera att "shell> " i exemplen är en kommandoradsprompt.

shell1> flock /tmp -c cat; shell2> flock -w .007 /tmp -c echo; /bin/echo $?

Sätt exklusivt lås på katalogen /tmp och det andra kommandot kommer att misslyckas.

shell1> flock -s /tmp -c cat; shell2> flock -s -w .007 /tmp -c echo; /bin/echo $?

Sätt shared lock till katalogen /tmp så kommer det andra kommandot inte att misslyckas. Observera att försök att få exklusivt lås med det andra kommandot skulle misslyckas.

shell> flock -x local-lock-fil echo 'a b c'

Hämta det exklusiva låset "local-lock-file" innan du kör echo med 'a b c'.

(; flock -n 9 || exit 1; # ... kommandon utförda under lås ...; ) 9>/var/lock/mylockfile

Formuläret är praktiskt i skalskript. Det läge som används för att öppna filen spelar ingen roll för flock; om du använder > eller >> kan låsfilen skapas om den inte redan finns, men skrivbehörighet krävs. Om du använder < krävs att filen redan finns, men endast läsbehörighet krävs.

[ "${FLOCKER}" != "$0" ] && exec env FLOCKER="$0" flock -en "$0" "$0" "$@" || :

Detta är användbar standardkod för skalskript. Lägg den högst upp i det skalskript som du vill låsa så låser det sig automatiskt vid första körningen. Om miljövariabeln $FLOCKER inte är inställd på det skalskript som körs, exekveras flock och tar ett exklusivt icke-blockerande lås (med själva skriptet som låsfil) innan det exekveras igen med rätt argument. Det ställer också in miljövariabeln FLOCKER till rätt värde så att det inte körs igen.

shell> exec 4<>/var/lock/mylockfile; shell> flock -n 4

Denna form är lämplig för att låsa en fil utan att starta en subprocess. Shell öppnar låsfilen för läsning och skrivning som fildeskriptor 4, sedan används flock för att låsa deskriptorn.

H. Peter Anvin <hpa@zytor.com>

Copyright © 2003-2006 H. Peter Anvin. Detta är fri programvara; se källan för kopieringsvillkor. Det finns INGEN garanti; inte ens för SÄLJBARHET eller LÄMPLIGHET FÖR ETT BESTÄMMT SYFTE.

flock(2), fcntl(2)

För felrapporter, använd felhanteraren https://github.com/util-linux/util-linux/issues.

Kommandot flock ingår i paketet util-linux som kan hämtas från Linux Kernel Archive https://www.kernel.org/pub/linux/utils/util-linux/.

2026-05-18 util-linux 2.42.1