]> granicus.if.org Git - procps-ng/commitdiff
ps: possibility to display systemd unit for a process
authorLukas Nykryn <lnykryn@redhat.com>
Tue, 16 Apr 2013 12:42:30 +0000 (14:42 +0200)
committerLukas Nykryn <lnykryn@redhat.com>
Wed, 24 Apr 2013 07:24:44 +0000 (09:24 +0200)
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
ps/Makefile.am
ps/output.c
ps/ps.1

index 0a74197feed308535d101b30e393e30f7e5e3374..ea75f01def4806fed8fa2dc162c239b4dc737e97 100644 (file)
@@ -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
index e46f496f8477986ff75ebf5c0b91a079d1bf069e..7f38114443128918321c9da66da277e14aeac3a8 100644 (file)
@@ -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
index 3bc17ba9a62b6f4384f8cafdf81a46a9ba7ffe8d..39b77637f68389d8931fa3d442803cf6fbab7f76 100644 (file)
 
 #include "common.h"
 
+#ifdef WITH_SYSTEMD
+#include <systemd/sd-login.h>
+#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 9d3d1ce8cbde2a3f7799f143245cdefe6d065fce..0d66cf95cd482c1fe6774f8cb31027c7482a8cf9 100644 (file)
--- 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 ).