From 7ab5d33c5c764d0cdc443298aee5f88d450c6e47 Mon Sep 17 00:00:00 2001 From: Lukas Nykryn Date: Tue, 16 Apr 2013 14:42:30 +0200 Subject: [PATCH] ps: possibility to display systemd unit for a process Library systemd-login offers possibility to display name of a systemd unit file for specific pid. Note that not all processes are part of a system unit/service (e.g. user processes, or kernel threads). This patch adds output option "sd_unit" which will show name of systemd unit or "-", when process does not belong to any unit. To maintain compatibility with non-systemd systems, procps must be configured with --with-systemd option to enable this option. --- configure.ac | 18 ++++++++++++++++++ ps/Makefile.am | 4 ++++ ps/output.c | 25 +++++++++++++++++++++++++ ps/ps.1 | 4 ++++ 4 files changed, 51 insertions(+) diff --git a/configure.ac b/configure.ac index 0a74197f..ea75f01d 100644 --- a/configure.ac +++ b/configure.ac @@ -264,6 +264,24 @@ then fi AC_SUBST(DEJAGNU) +AC_ARG_WITH([systemd], + [AS_HELP_STRING([--with-systemd], [enable systemd support])], + [], [with_systemd=no]) + +if test "x$with_systemd" != xno; then + PKG_CHECK_MODULES([SYSTEMD], [libsystemd-login], [], [ + AC_CHECK_LIB(systemd-login, sd_pid_get_unit, [have_systemd=yes], [have_systemd=no]) + if test "x$have_systemd" = xno; then + AC_MSG_ERROR([systemd support missing/incomplete]) + fi + SYSTEMD_LIBS="-lsystemd-login" + ]) + AM_CONDITIONAL(WITH_SYSTEMD, true) + AC_DEFINE(WITH_SYSTEMD, 1, [enable systemd support]) +else + AM_CONDITIONAL(WITH_SYSTEMD, false) +fi + AC_CONFIG_FILES([ Makefile include/Makefile diff --git a/ps/Makefile.am b/ps/Makefile.am index e46f496f..7f381144 100644 --- a/ps/Makefile.am +++ b/ps/Makefile.am @@ -5,6 +5,10 @@ AM_CPPFLAGS = \ AM_LDFLAGS = ../proc/libprocps.la +if WITH_SYSTEMD +AM_LDFLAGS += @SYSTEMD_LIBS@ +endif + dist_man_MANS = ps.1 # Use `ginstall' in the definition of PROGRAMS and in dependencies to avoid diff --git a/ps/output.c b/ps/output.c index 3bc17ba9..39b77637 100644 --- a/ps/output.c +++ b/ps/output.c @@ -71,6 +71,10 @@ #include "common.h" +#ifdef WITH_SYSTEMD +#include +#endif + /* TODO: * Stop assuming system time is local time. */ @@ -1169,7 +1173,25 @@ static int pr_sgi_p(char *restrict const outbuf, const proc_t *restrict const pp return snprintf(outbuf, COLWID, "*"); } +#ifdef WITH_SYSTEMD +/************************* Systemd stuff ********************************/ +static int pr_sd_unit(char *restrict const outbuf, const proc_t *restrict const pp){ + int r; + size_t len; + char *unit; + r = sd_pid_get_unit(pp->tgid, &unit); + if(r<0) goto fail; + len = snprintf(outbuf, COLWID, "%s", unit); + free(unit); + return len; + +fail: + outbuf[0] = '-'; + outbuf[1] = '\0'; + return 1; +} +#endif /****************** FLASK & seLinux security stuff **********************/ // move the bulk of this to libproc sometime @@ -1496,6 +1518,9 @@ static const format_struct format_array[] = { {"sched", "SCH", pr_sched, sr_sched, 3, 0, AIX, TO|RIGHT}, {"scnt", "SCNT", pr_nop, sr_nop, 4, 0, DEC, AN|RIGHT}, /* man page misspelling of scount? */ {"scount", "SC", pr_nop, sr_nop, 4, 0, AIX, AN|RIGHT}, /* scnt==scount, DEC claims both */ +#ifdef WITH_SYSTEMD +{"sd_unit", "UNIT", pr_sd_unit, sr_nop, 31, 0, LNX, ET|LEFT}, +#endif {"sess", "SESS", pr_sess, sr_session, 5, 0, XXX, PO|PIDMAX|RIGHT}, {"session", "SESS", pr_sess, sr_session, 5, 0, LNX, PO|PIDMAX|RIGHT}, {"sgi_p", "P", pr_sgi_p, sr_nop, 1, 0, LNX, TO|RIGHT}, /* "cpu" number */ diff --git a/ps/ps.1 b/ps/ps.1 index 9d3d1ce8..0d66cf95 100644 --- a/ps/ps.1 +++ b/ps/ps.1 @@ -1489,6 +1489,10 @@ SCHED_FIFO, SCHED_RR, SCHED_BATCH, SCHED_ISO, and SCHED_IDLE are respectively displayed as 0, 1, 2, 3, 4, and 5. T} +sd_unit UNIT T{ +displays systemd unit which a process belongs to. +T} + sess SESS T{ session ID or, equivalently, the process ID of the session leader. (alias .BR session , \ sid ).