---
name: "postpone"
section: "1"
platform: "linux"
package: "postpone"
version: "0.2"
release: "Debian 7 (Wheezy)"
platforms: ["linux"]
url: "https://new.carta.tech/postpone"
---

# postpone(1)

schedules a command to be executed later when a lockfile disappears

## NAME

postpone - schedules a command to be executed later when a lockfile disappears

## SYNOPSIS

**postpone \[-dfv\] \[-lwLoO *FILE*\] *command args ...***

## DESCRIPTION

**Postpone** schedules a command to be executed later when a lockfile disappears. Intended usage is when a command is executed possibly multiple times, but running once is sufficient. This happens in maintainer scripts of Debian packages, for example, the menu system will need to run **update-menus** every time a menu file is installed or removed, but if several packages are processed at once, a single update-menus run at the end is sufficient. In fact, **postpone** is a generalization of similar code found in update-menus that is already able to postpone itself. Another prominent use case are TeX packages that need to rebuild several indices.

On startup, **postpone** will look if any of the lock files given with **--wait** exists. If not, it will run *command* immediately in foreground. Otherwise, it will fork to background, waiting for the lock file(s) to disappear. At the same time, the **--lock** file is created to indicate to other **postpone** instances that *command* is already scheduled for execution; the other instances will exit without further action.

Additionally, **--extra-lock** will be acquired just before the execution of *command*, this allows the serialization of several (different) background jobs.

All lockfiles are optional. See below for examples.

## OPTIONS

- \-w *FILE* or --wait *FILE*

  Wait for *FILE* before running *command*. Can be given several times. This activates the main feature of **postpone** -- delay execution until some other task has exited (specifically, released its fcntl() lock).

- \-l *FILE* or --lock *FILE*

  Creates lockfile *FILE*. If **postpone** is called again with the same *FILE*, it will exit, assuming the task is already postponed. Make sure that the (effects of the) commands are the same for the same lockfile.

- \-L *FILE* or --extra-lock *FILE*

  Before running *command*, acquire lock on *FILE*. Use this to serialize several (most likely different) postponed commands.

- \-d or --debian

  Equivalent to **--wait /var/lib/dpkg/lock --extra-lock** **/var/lib/dpkg/postpone.lock**. Meant for use in maintainer scripts of Debian packages, will wait for dpkg and apt-get to exit and serialize the postponed commands.

- \-o *FILE* or --output *FILE*

  Redirect stdout and stderr output to *FILE* when running in background. (Discarded otherwise.) If *FILE* ends with "XXXXXX", mkstemp is used.

- \-O *FILE* or --all-output *FILE*

  Like **--output**, but always redirect stdout and stderr output to *FILE*.

- \-f or --foreground

  Do not detach while waiting for locks.

- \-v or --verbose

  Verbose output. Repeat for debugging output.

- \--help

  Print options summary and exit.

- \--version

  Print version information and exit.

- \--version-string

  Print version information in machine readable form and exit.

## EXAMPLES

Example usage in a texlive postinst maintainer script:

    if \[ -x /usr/bin/postpone \] ; then\
         postpone --verbose --lock /var/run/updmap-sys.lock --debian \\\
             \--all-output /tmp/updmap.XXXXXXXX \\\
             updmap-sys\
     else\
         updmap-sys\
     fi

## FILES

- /var/lib/dpkg/lock

  Dpkg's default lockfile.

- /var/lib/dpkg/postpone.lock

  Default extra lockfile when running with **--debian**.

## BUGS

**Postpone** currently only uses fcntl() to acquire locks on **--wait**, usage with applications using flock() will fail gracefully. (The command will run immediately.) **--lock** and **--extra-lock** use flock().

## COMPATIBILITY

For compatibility, using unknown options does not abort the program. Applications can use **--version-string** if they need to compare the **postpone** version number.

## SEE ALSO

[update-menus(1)](/update-menus/1.md), [fcntl(2)](/fcntl/2.md), [flock(2)](/flock/2.md), [mkstemp(3)](/mkstemp/3.md), [dpkg(1)](/dpkg/1.md).

## COPYRIGHT

Copyright (C) 2007  Christoph Berg

Based on code from:\
 Debian menu system -- update-menus\
 update-menus/update-menus.cc

Copyright (C) 1996-2003  Joost Witteveen\
 Copyright (C) 2002-2004  Bill Allombert and Morten Brix Pedersen

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
