home

GNU Parallel for Serial Execution

gnu-parallel

It’s sometimes useful to use GNU Parallel for running things serially. Why? Because it remembers what it’s done, it can pick up where it left off, store output per job, and a ton of other stuff.

Example: re-encoding videos

Input file:

some-video.mp4
some-other-video.mp4
...

Command:

parallel --arg-file input.txt ffmpeg {} -o {.}.reencoded.mp4

This will run ffmpeg on every line of input with -o set to the input line (without the extension) plus .reencoded.mp4.

If --joblog is given, Parallel keeps a log of every completed job and some metadata e.g.

Seq    Host    Starttime    JobRuntime    Send    Receive    Exitval    Signal    Command
1      :    1686425772.721         57.002    0    0    0    0    ffmpeg some-video.mp4 -o some-video.reencoded.mp4
2      :    1686425829.720         85.124    0    0    0    0    ffmpeg some-other-video.mp4 -o some-other-video.reencoded.mp4
...

Parallel can use the joblog to pick up where it left off, just add --resume.

parallel --arg-file input.txt \
         --joblog reencode_job.joblog \
         --resume \
         ffmpeg {} -o {.}.reencoded.mp4

This runs Parallel with one invocation of ffmpeg at a time, keeps track of every command it runs, and can pick up where it left off.

If you have questions or comments (or corrections 😅) on one of my posts, feel free to email me :)