Search code examples
linuxserviceserversystemd

Systemd with multiple execStart


Is it possible to create service with the same script started with different input parameters?

Example:

[Unit]
Description=script description

[Service]
Type=simple
ExecStart=/script.py parameters1
ExecStart=/script.py parameters2
Restart=on-failure

[Install]
WantedBy=multi-user.target

Is it possible?

Will it be launched in serial-mode? Or in two different process?


Solution

  • if Type=simple in your unit file, you can only specify one ExecStart, but you can add as many ExecStartPre, ExecStartPost, but none of this is suited for long running commands, because they are executed serially and everything one start is killed before starting the next one.

    If Type=oneshot you can specify multiple ExecStart, they run serially not in parallel.

    If what you want is to run multiple units in parallel, there a few things you can do:

    If they differ on 1 param

    You can use template units, so you create a /etc/systemd/system/[email protected]. NOTE: (the @ is important).

    [Unit]
    Description=script description %I
    
    [Service]
    Type=simple
    ExecStart=/script.py %i
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    

    And then you exec:

    $ systemctl start [email protected] [email protected]
    

    or...

    Target dependencies

    You can create multiple units that links to a single target:

    #/etc/systemd/system/bar.target
    [Unit]
    Description=bar target
    Requires=multi-user.target
    After=multi-user.target
    AllowIsolate=yes
    

    And then you just modify you .service units to be WantedBy=bar.target like:

    #/etc/systemd/system/[email protected]
    [Unit]
    Description=script description %I
    
    [Service]
    Type=simple
    ExecStart=/script.py %i
    Restart=on-failure
    
    [Install]
    WantedBy=bar.target
    

    Then you just enable the foo services you want in parallel, and start the bar target like this:

    $ systemctl daemon-reload
    $ systemctl enable [email protected]
    $ systemctl enable [email protected]
    $ systemctl start bar.target
    

    NOTE: that this works with any type of units not only template units.