On Fri, Nov 29, 2013 at 10:03 PM, <[email protected]> wrote: > I'm trying to launch a perl service using systemd. > > The perl script is 'smtpprox' > (https://github.com/jnorell/smtpprox/blob/master/smtpprox) > > The unit file I created is > > cat /etc/systemd/system/smtpprox.service > [Unit] > Description=smtpprox > Requires=var-run.mount > After=var-run.mount
It should be never necessary to add dependencies on /var/run, as systemd always mounts a tmpfs on /run before starting any service at all, and /var/run should just be a symlink to that. > > [Service] > Type=oneshot > KeepAfterExit=true Should be Type=simple (see below). > PrivateTmp=false PrivateTmp is already off by default. > ExecStart=/usr/local/etc/postfix/filters/smtpprox > 127.0.0.1:10025 127.0.0.1:10026 > ExecStop=kill `pidof perl` ExecStop is not needed (see below). > > [Install] > WantedBy=multi-user.target > > When I exec > > systemctl daemon-reload > systemctl start smtpprox.service > > It does start the service > > ps ax | grep smtpprox > 10835 pts/2 S+ 0:00 systemctl start > smtpprox-custom.service > 10837 ? Ss 0:00 /usr/bin/perl -w > /usr/local/etc/postfix/filters/smtpprox --children=4 > 127.0.0.1:10025 127.0.0.1:10026 > 10838 ? S 0:00 /usr/bin/perl -w > /usr/local/etc/postfix/filters/smtpprox --children=4 > 127.0.0.1:10025 127.0.0.1:10026 > 10839 ? S 0:00 /usr/bin/perl -w > /usr/local/etc/postfix/filters/smtpprox --children=4 > 127.0.0.1:10025 127.0.0.1:10026 > 10840 ? S 0:00 /usr/bin/perl -w > /usr/local/etc/postfix/filters/smtpprox --children=4 > 127.0.0.1:10025 127.0.0.1:10026 > 10841 ? S 0:00 /usr/bin/perl -w > /usr/local/etc/postfix/filters/smtpprox --children=4 > 127.0.0.1:10025 127.0.0.1:10026 > > but never exits/releases at shell > > systemctl start smtpprox-custom.service > ( ... just sits here ... ) > > How do I get the unit to exec that script, leave the script running, and > exit the properly? Don't use Type=oneshot. It is only for short-lived "tool" services that do something and quickly exit, so right now the 'start' action hangs because systemd is waiting for the process to exit. And smtpprox looks like it's a real daemon – when you start it, it continues to run waiting for connections. For this, Type=oneshot is wrong, and the default Type=simple should be right. (This also means KeepAfterExit= can be removed.) (Type=simple is for daemons that keep running in "foreground" when started. Some daemons, when started, fork a "background" process and have the original one exit; those would need Type=forking instead.) > > Also, the > > ExecStop=kill `pidof perl` > > works, but kills ALL running perl scripts/jobs -- not just the smtpprox > parent/children. > > What's the right way to get systemd to find/kill only the pids related > to smtpprox? The right way is to not use ExecStop= at all. If no command is specified for stopping the service, systemd just kills all processes belonging to that service, using cgroups to find the correct processes. (You can check `systemctl status smtpprox-custom.service` for just one service, or `systemd-cgls` for all of them.) -- Mantas Mikulėnas <[email protected]> _______________________________________________ systemd-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/systemd-devel
