.__ __ .__ .__
_____ __ __| |_/ |_|__|_____ | | ____ ___ ___
/ \| | \ |\ __\ \____ \| | _/ __ \\ \/ /
| Y Y \ | / |_| | | | |_> > |_\ ___/ > <
|__|_| /____/|____/__| |__| __/|____/\___ >__/\_ \
\/ |__| \/ \/
Multiplex is a command-line multiplexer along with a simple Python API to run multiple processes in parallel and stop them all at once, or based on some condition.
Multiplex will gracefully shutdown child processes, and multiplex their output and error streams to stdout and stderr in a way that is easily parsable with regular command line tools.
Multiplex is useful when you need to run multiple programs all at once
and combine their output. For instance, you need a webserver, a
workqueue and a database to run standalone all together. You could write
a shell script, or you could write a one liner using multiplex.
Here's how you'd benchmark Python's embedded HTTP server with a one-liner:
multiplex "|silent=python -m http.server" "+1|end=ab -n1000 http://localhost:8000/"
Installing
Multiplex is available on PyPI at https://pypi.org/project/multiplex-sh
Using uv (recommended)
$ uv tool install multiplex-sh
$ multiplex --help
Using pip
$ pip install multiplex-sh
$ multiplex --help
Direct download
Quick, from the shell:
$ curl -o multiplex https://raw.githubusercontent.com/sebastien/multiplex/main/src/py/multiplex.py; chmod +x multiplex
$ ./multiplex --help
Usage
Commands
Here are some example commands that will help understand the syntax:
Running a simple command:
multiplex "python -m http.server"
Running a command after 5s delay:
multiplex "+5=python -m http.server"
Running a command after another completes:
multiplex "A=python -m http.server" "+A=ab -n1000 http://localhost:8000/"
Running multiple commands with complex coordination:
multiplex "DB=mongod" "API+2=node server.js" "+API|end=npm test"
Command Syntax
Commands follow a structured format: [KEY][+DELAY][|ACTIONS]=COMMAND
Naming (KEY=)
- Purpose: Assign a name to a process for reference by other commands
- Format:
KEY=commandwhere KEY is alphanumeric (A-Z, a-z, 0-9, _) - Examples:
A=python -m http.serverDB=mongod --port 27017API_SERVER=node app.js
Delays (+DELAY)
Commands can be delayed in two ways:
Time-based delays
- Format:
+SECONDSwhere SECONDS can be integer or decimal - Examples:
+5=python script.py(wait 5 seconds)+1.5=echo "delayed"(wait 1.5 seconds)SERVER+10=curl localhost:8000(named SERVER, wait 10s)
Process-based delays
- Format:
+PROCESS_NAMEwait for named process to complete - Examples:
+A=ab -n1000 http://localhost:8000/(wait for process A)+DB=node migrate.js(wait for DB process to complete)+SERVER=echo "server is done"(wait for SERVER process)
Actions (|ACTION)
Actions modify process behavior:
|end: When this process ends, terminate all other processes|silent: Suppress all output (stdout and stderr)|noout: Suppress stdout only|noerr: Suppress stderr only
Actions can be combined: |silent|end=command
Examples by Pattern
Sequential execution:
multiplex "BUILD=npm run build" "+BUILD=npm start"
Parallel with coordination:
multiplex "DB=mongod" "API+2=node server.js" "+API=npm test"
Benchmark pattern:
multiplex "SERVER|silent=python -m http.server" "+1|end=ab -n1000 http://localhost:8000/"
Development environment:
multiplex "DB=mongod" "API+2=npm run dev" "UI+2=npm run ui" "+5=open http://localhost:3000"
Special Cases
If your command contains an equals sign, use an empty prefix:
multiplex "=echo a=b"
Global Options
Timeout:
- Format:
-t|--timeout SECONDS - Purpose: Terminate all processes after specified time
- Example:
multiplex -t 30 "server=python -m http.server" "test=curl localhost:8000"
Examples
The examples/ directory contains practical demonstrations of multiplex features:
Basic Patterns
Sequential Build (examples/sequential-build.sh)
multiplex "BUILD=echo 'Building...'" "+BUILD=echo 'Starting...'"
Demonstrates process-based delays where one command waits for another to complete.
Time-based Delays (examples/time-delays.sh)
multiplex "echo 'immediate'" "+1=echo 'after 1s'" "+2.5=echo 'after 2.5s'"
Shows different timing patterns with integer and decimal delays.
Process Dependencies (examples/process-delays.sh)
multiplex "STEP1=echo 'init'" "STEP2+STEP1=echo 'process'" "+STEP2=echo 'done'"
Demonstrates chaining processes where each waits for the previous to complete.
Real-world Scenarios
Development Environment (examples/dev-environment.sh)
multiplex "DB=mongod" "API+2=node server.js" "UI+2=npm run ui" "+5=open browser"
Simulates starting a full development stack with proper coordination.
Parallel Coordination (examples/parallel-coordination.sh)
multiplex "DB=database" "API+2=api-server" "UI+2=ui-server" "+5=open-browser"
Shows how to coordinate multiple services starting in parallel with delays.
CI/CD Pipeline (examples/cicd-pipeline.sh)
multiplex "BUILD=build" "+BUILD=test" "+TESTS=deploy|end"
Demonstrates a realistic deployment pipeline with sequential steps.
Advanced Features
Actions Demo (examples/actions-demo.sh)
multiplex "SERVER|silent=long-running" "+2|end=test-and-exit"
Shows silent processes and automatic termination with |end action.
HTTP Benchmark (examples/http-benchmark.sh)
multiplex "A=python -m http.server" "+A=ab -n1000 http://localhost:8000/"
Real HTTP server benchmarking where the test waits for server startup.
Special Cases (examples/special-cases.sh)
multiplex "=echo 'VAR=value'" "SETUP|silent=setup" "+SETUP=continue"
Handles commands with equals signs and complex action combinations.
Complete Demo (examples/complete-demo.sh)
multiplex "SETUP|silent=setup" "DB+1=database" "API+DB=api" "UI+API=ui" "+UI|end=done"
Comprehensive example showcasing all features: naming, time/process delays, actions, and coordination.
Running Examples
All examples are executable scripts:
cd multiplex
bash examples/sequential-build.sh
bash examples/dev-environment.sh
bash examples/http-benchmark.sh
Each example includes descriptive output explaining what's happening during execution.
Metadata
Release files for multiplex-sh 1.0.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| multiplex_sh-1.0.0.tar.gz | 24.7 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| multiplex_sh-1.0.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 47.5 kB
Release files / multiplex_sh-1.0.0.tar.gz
| Download URL | multiplex_sh-1.0.0.tar.gz |
|---|---|
| Size | 24.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e5d67fefd108f424bec3090932d1327406af70151a25b8c093b8c836896b6e41
|
|
BLAKE2b-256 checksum How to use checksums |
868524469f729928605986579797e24e464c9f03d79c716ad2fc83adfe672424
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.5
|
Release files / multiplex_sh-1.0.0-py3-none-any.whl
| Download URL | multiplex_sh-1.0.0-py3-none-any.whl |
|---|---|
| Size | 22.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
73293c7d586c6755c6fea4abd5649061dd5291d2de035177c9dec7a8665d64d8
|
|
BLAKE2b-256 checksum How to use checksums |
31d686f2b8d78d64c82dbbfad0d17717179d7e15e23f1875521fd1c956664729
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.13.5
|
Security for multiplex-sh 1.0.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.