From 886d4e8d2d43f4d564e108b1c3f2515256c6d144 Mon Sep 17 00:00:00 2001 From: Narvin Singh Date: Fri, 1 Jan 2021 23:21:44 -0500 Subject: [PATCH] Feat: rpid The daemon and scheduler will need rpid to get the PID of the login process that they are both descended from in order to create a unique fifo in order to not conflict with other daemons and schedulers in other sessions. --- rpid | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100755 rpid diff --git a/rpid b/rpid new file mode 100755 index 0000000..b1f2b71 --- /dev/null +++ b/rpid @@ -0,0 +1,63 @@ +#!/bin/bash + +USAGE=' +USAGE: rpid [=login] + + pid The PID of the process for which you want to find the root PID. + + root_name + The name (not command line) of the root process, for which + to find the PID. Defaults to login. + +EXAMPLES: + + Any of these will display this help message. + + rpid -h + rpid -help + rpid --help + + Get the PID of the login process that is the ancestor of the current + process. + + rpid $$ +' + +# Validate the arguments +if [[ "$#" -lt 1 || "$#" -gt 2 ]]; then + printf '%s' "${USAGE}" 1>&2 + exit 128 +fi + +pid="$1" + +# Check if the user needs help +if [[ "${pid}" =~ ^(-h|-(-)?help)$ ]]; then + printf '%s' "${USAGE}" 1>&2 + exit 0 +fi + +root_name="${2:-login}" + +get_info() { + local -ri current_pid="$1" + if [[ ! -r "/proc/${current_pid}/status" ]]; then exit 1; fi + mapfile info < \ + <(grep --null -E -m 2 '^(Name|PPid):' "/proc/${current_pid}/status" \ + | sort | cut -f 2) + name="${info[0]##[[:space:]]}" + name="${name%%[[:space:]]}" + ppid="${info[1]##[[:space:]]}" + ppid="${ppid%%[[:space:]]}" +} + +next_pid="${pid}" +while [[ "${name}" != "${root_name}" && "${ppid}" -ne 1 ]]; do + get_info "${next_pid}"; + name_pid="${next_pid}" + next_pid="${ppid}" +done + +if [[ "${name}" != "${root_name}" ]]; then exit 1; fi +printf '%s\n' "${name_pid}" +