Locked Files in Linux: A Practical Guide.

Linux uses file locks to prevent multiple processes from interfering with the same resource. Understanding locks helps you diagnose errors like APT’s “Could not get lock” message safely, without deleting lock files and risking system problems.

Locked Files in Linux: A Practical Guide.
Photo by Cristina Gottardi / Unsplash

When working with Linux, you will/may encounter an error such as:

Reading package lists... Done
E: Could not get lock /var/lib/apt/lists/lock. It is held by process 17979 (apt)
N: Be aware that removing the lock file is not a solution and may break your system.
E: Unable to lock directory /var/lib/apt/lists/

At first, the word lock can be confusing. It may sound as if Linux has permanently locked a file and you need to unlock it manually.

Usually, that is not what is happening.

A lock is primarily a way for programs to coordinate access to shared resources. Basically, it prevents two processes from performing conflicting operations at the same time.


1. What Is a Locked File?

A locked file is a file or resource that a program has marked as being in use so that another program does not interfere with it.

Imagine two people trying to edit the same document simultaneously. If both make changes at the same time, their work could conflict.

A similar problem can occur with Linux processes:

Process A ──► modifies a resource
Process B ──► modifies the same resource
                    ↓
             Possible conflict

A locking mechanism helps prevent this:

Process A ──► LOCK ──► uses resource
                         │
Process B ──► WAIT ─────┘

Once Process A finishes, the lock is released and Process B can continue.

2. Why Do Programs Use Locks?

Locks are useful whenever multiple processes might access the same resource.

Without appropriate locking, two processes could:

  • overwrite each other's changes;
  • corrupt data;
  • produce inconsistent results;
  • interfere with an operation that must be completed as a whole.

Package managers are a common example because they modify important system databases and package information.

3. The APT Lock Example

APT is the package-management system used by Debian-based Linux distributions such as Ubuntu Server.

Suppose you run:

$ sudo apt update

APT needs to work with package-list information under:

/var/lib/apt/lists/

APT uses a lock to prevent conflicting package-management operations.

If another APT process is already using the resource, your command may produce:

Could not get lock /var/lib/apt/lists/lock.
It is held by process 17979 (apt)

This means:

Another APT process with process ID 17979 currently holds the lock.

Your command is being prevented from accessing the resource in a conflicting way.

4. What Is a PID?

The number shown in the error is a PID, or Process ID.

In this example:

process 17979 (apt)

17979 identifies the running process, while apt tells you which program it belongs to.

You can inspect it with:

$ ps -p 17979 -f

You may see information similar to:

UID    PID    PPID    CMD
root   17979  ...     apt update

This helps you determine what the process is actually doing.

5. How to Check Whether APT Is Running

You can look for APT or related package-management processes with:

$ ps aux | grep -E 'apt|dpkg'

You can also check whether a particular lock file is being held by a process:

$ sudo lsof /var/lib/apt/lists/lock

If APT is legitimately running, the safest approach is usually to wait for it to finish.

Afterward, retry your command.

6. ⚠️ Why You Should Not Simply Delete the Lock File

You may find advice online telling you to run:

$ sudo rm /var/lib/apt/lists/lock

This is generally not the correct first solution.

The existence of a lock file is not necessarily the actual problem. The important question is:

Is another process currently using the resource?

If an APT process is actively working and you simply remove a lock file, you have not necessarily stopped that process from modifying the underlying data.

You could end up with conflicting operations or corrupted package-management state.

Therefore, do not delete an APT lock file just because you see a lock error.

7. Lock Files vs. File Permissions

It is important to distinguish permissions from locks.

Permissions answer:

“Who is allowed to access this file?”

For example:

-rw-r--r--

Permissions determine whether a user can read, write, or execute a file.

A lock answers a different question:

“Is another process currently using this resource in a way that requires other processes to wait?”

For example:

Permissions
     ↓
Who may access the resource?

Locking
     ↓
Who is currently using the resource?

They solve different problems.

8. A Lock Does Not Necessarily Mean the File Is Unreadable

A common misunderstanding is:

“If a file is locked, nobody can access it.”

That is not necessarily true.

Locking behavior depends on the program and the type of lock being used. Some locks are advisory, meaning cooperating programs check the lock and respect it.

Linux also supports different mechanisms for locking and synchronization.

Therefore, don't think of a lock simply as a physical barrier around a file.

Instead, think of it as a coordination mechanism between processes.

9. A Simple Troubleshooting Procedure

When you encounter a message such as:

Unable to lock directory

follow these steps.

Step 1: Read the error carefully

Look for the process ID:

It is held by process 17979 (apt)

Step 2: Inspect the process

$ ps -p 17979 -f
$ ps aux | grep -E 'apt|dpkg'

Step 4: If appropriate, wait

If the process is performing a legitimate operation, allow it to finish.

Step 5: Retry your command

Once the operation has completed, try your original command again.

Step 6: Investigate further if the process is genuinely stuck

If a package-management process appears to have stopped responding, investigate its state before taking action. Avoid randomly deleting lock files.

10. The Mental Model to Remember

The easiest way to remember Linux locks is:

           Shared resource
                  │
                  ▼
             ┌─────────┐
             │  LOCK   │
             └────┬────┘
                  │
                  ▼
             Process A
             is using it
                  │
                  ▼
             Process B
              must wait

The lock exists to protect the operation, not simply to make the file inaccessible.

In your APT example:

/var/lib/apt/lists/
          │
          ▼
       APT lock
          │
          ▼
   apt process 17979
          │
          ▼
   Other APT processes wait


BONUS

Here are a few concrete examples of Linux locking and synchronization mechanisms:

1. flock — file locking

flock allows a process to place a lock on a file while it performs an operation.

For example:

$ flock /tmp/mylock.lock -c "echo 'Doing work'; sleep 10"

If another process tries to acquire the same lock while it is held, it can be made to wait.

A common use is preventing two copies of a script from running simultaneously.

2. fcntl() — programmatic file locking

Programs can use the Linux fcntl() system call to place locks on files.

For example, a program might say:

Process A → acquire lock
Process A → modify file
Process A → release lock

Another process can check the lock before modifying the same file.

This is commonly used by applications that need more control than the flock command provides.

3. mutex — synchronizing threads

A mutex (mutual exclusion) is commonly used when multiple threads inside a program share data.

Conceptually:

Thread A → LOCK mutex → modify shared data → UNLOCK
Thread B → WAIT
Thread B → LOCK mutex → modify shared data → UNLOCK

This prevents two threads from modifying the same critical section simultaneously.

4. Semaphores

A semaphore controls access to a resource using a counter.

For example, imagine a program has only 3 resources available:

Semaphore = 3

Process A → takes one → 2 available
Process B → takes one → 1 available
Process C → takes one → 0 available
Process D → waits

When one process releases a resource, another process can proceed.

5. lockf

Linux also provides lockf() for advisory file locking. It is commonly used by programs when they need to coordinate access to portions of files.

Linux locks are mechanisms that allow processes to safely coordinate access to shared resources. They help prevent simultaneous operations from interfering with one another.

When you see an APT error such as:

Could not get lock ... It is held by process 17979 (apt)
...
..
.

the correct first response is not to delete the lock file. Instead, identify the process holding the lock, determine what it is doing, and allow a legitimate operation to finish.

Once you understand that distinction, errors involving APT locks—and many other Linux locking problems—become much easier to diagnose safely.

Thanks for reading—and as always, keep experimenting, keep learning, and keep digging beneath the surface.

Keep Us Caffeinated  ⦿ ⦿
Spotify Logo
SNUBmonkey Join our readers 37K+