diff --git a/avdd b/avdd index b24df32..a110b47 100755 --- a/avdd +++ b/avdd @@ -43,8 +43,10 @@ DEFAULT_PRE=' ' DEFAULT_SEP_L='| ' DEFAULT_SEP_R=' ' DEFAULT_SUF=' ' -MOD_DIR="$(dirname "$0")"/mod -FIFO=/tmp/avdd-fifo-"$("$(dirname "$0")"/rpid)" +DIR="$(dirname "$0")" +MOD_DIR="${DIR}/mod" +DAEMON="$(basename "$0")" +FIFO="/tmp/${DAEMON}-fifo-$("${DIR}/rpid" $$)" mod_list="${1-${DEFAULT_MOD_LIST}}" diff --git a/avds b/avds index dde335b..3409bed 100755 --- a/avds +++ b/avds @@ -5,7 +5,8 @@ USAGE: avds [] [] mod_list A comma or space separated list of modules to request that - the daemon execute. + the daemon execute. If mod_list begins this '>>* ', then + requests are sent to all running daemons. when The integer number of milliseconds to wait before sending the request, or one of the following values: @@ -31,6 +32,10 @@ EXAMPLES: avds 'vol,bl' + Send the previous requests to all running daemons. + + avds '>>* vol,bl' + If there are cpu and memory usage modules named 'cpu' and 'mem' that update the cpu and memory usage statuses, send a requst to update both of those statuses every 5 seconds. @@ -44,7 +49,6 @@ EXAMPLES: avds 'bat,dt' m true " DAEMON=avdd -FIFO=/tmp/"${DAEMON}"-fifo-"$("$(dirname "$0")"/rpid)" # Convert integer milliseconds to floating point seconds ms_to_s() { @@ -65,6 +69,15 @@ if [[ "${mod_list}" =~ ^(-h|-(-)?help)$ ]]; then exit 0 fi +# Check if we will be sending requests to all daemons, or set the named pipe +# for this login session +if [[ "${mod_list}" =~ ^\>\>\*\ ]]; then + mod_list="${mod_list:4}" + is_request_all=1 +else + fifo="/tmp/${DAEMON}-fifo-$("$(dirname "$0")/rpid" $$)" +fi + when="${2:-0}" # Validate when @@ -103,11 +116,24 @@ while [[ "${first_run}" -eq 1 || -n "${repeat}" ]]; do fi fi - # Write each command to the pipe - if [[ ! -p "${FIFO}" ]]; then - printf 'The daemon %s is not running\n' "${DAEMON}" 1>&2 - exit 1 + # Write each command to the named pipe for this login session + if [[ ! -v is_request_all ]]; then + if [[ ! -p "${fifo}" ]]; then + printf 'The daemon %s is not running\n' "${DAEMON}" 1>&2 + exit 1 + fi + printf '%s\n' "${mod_list}" >> "${fifo}" + # Write each command to all the daemon named pipes + else + readarray -d '' fifos \ + < <(find /tmp -maxdepth 1 -type p -name "${DAEMON}-fifo-*" -print0) + if [[ "${#fifos[@]}" -eq 0 ]]; then + printf 'There are no daemons running\n' 1>&2 + exit 1 + fi + for fifo in "${fifos[@]}"; do + printf '%s\n' "${mod_list}" >> "${fifo}" + done fi - printf '%s\n' "${mod_list}" >> "${FIFO}" done diff --git a/rpid b/rpid index fb733d0..fe2897b 100755 --- a/rpid +++ b/rpid @@ -22,6 +22,16 @@ EXAMPLES: process. rpid + + Get the PID of the first ancestor of the current process, if there + is no ancestor named "not_a_process." + + rpid $$ not_a_process + + Get the PID of the current process itself, if it is named + "current_process." + + rpid $$ current_process ' # Validate the arguments @@ -40,25 +50,19 @@ fi root_name="${2:-login}" -get_info() { - local -ri current_pid="$1" - if [[ ! -r "/proc/${current_pid}/status" ]]; then exit 1; fi +prev_pid="${pid}" +current_pid="${pid}" +while [[ "${name}" != "${root_name}" && -r "/proc/${current_pid}/status" ]]; do 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}" + prev_pid="${current_pid}" + current_pid="${info[1]##[[:space:]]}" + current_pid="${current_pid%%[[:space:]]}" done +printf '%s\n' "${prev_pid}" if [[ "${name}" != "${root_name}" ]]; then exit 1; fi -printf '%s\n' "${name_pid}"