[systemd-devel] [systemd.service] TCP listen port conflict resolution / explicit erring?

Lennart Poettering lennart at poettering.net
Tue May 2 12:11:32 UTC 2017


On Mon, 01.05.17 13:57, Alec Taylor (alec.taylor6 at gmail.com) wrote:

> Wrote some scripts to generate systemd .service files and start-up those
> services.
> 
> Currently just for some REST APIs, but soon will include distributed
> systems also.
> 
> I set the TCP listen port variable that is used by my .service like so:
> `Environment=PORT=4200`
> 
> To get PATH to work nicely, my `ExecStart` begins with:
> /bin/bash -c 'PATH=bash -c PATH=$PREPEND_PATH:$PATH
> 
> (would appreciate an alternative to launching a new shell there also!)
> 
> 
> 
> *Is there a systemd trick of explicitly erring on TCP listen-port
> conflicts?*
> And/or should I just write a parser that loops through all .service's and
> checks the `PORT=` and raises on conflict?

No, systemd can't do that for you. And even if it did, this would be
awfully racy as in the time between such a check and the service
trying to ultimately bind() to it something else might already have
taken it.

I'd generally recommend using socket activation for this, i.e. the
".socket" unit type systemd provides. This howver requires explicit
support in the relevant daemons. Many daemons do support that scheme
out-of-the-box now, but the majority probably does not.

Lennart

-- 
Lennart Poettering, Red Hat


More information about the systemd-devel mailing list