From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mp1 ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by ms11 with LMTPS id SAWNKjQfpF+heQAA0tVLHw (envelope-from ) for ; Thu, 05 Nov 2020 15:50:12 +0000 Received: from aspmx1.migadu.com ([2001:41d0:2:4a6f::]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)) by mp1 with LMTPS id UMVpJjQfpF9rYwAAbx9fmQ (envelope-from ) for ; Thu, 05 Nov 2020 15:50:12 +0000 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by aspmx1.migadu.com (Postfix) with ESMTPS id 12B66940119 for ; Thu, 5 Nov 2020 15:50:12 +0000 (UTC) Received: from localhost ([::1]:42858 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kahWc-0006gl-VO for larch@yhetil.org; Thu, 05 Nov 2020 10:50:10 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:34688) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kahWU-0006f0-H9 for guix-patches@gnu.org; Thu, 05 Nov 2020 10:50:02 -0500 Received: from debbugs.gnu.org ([209.51.188.43]:42344) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kahWU-0007gH-7Q for guix-patches@gnu.org; Thu, 05 Nov 2020 10:50:02 -0500 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1kahWU-0006uo-6G for guix-patches@gnu.org; Thu, 05 Nov 2020 10:50:02 -0500 X-Loop: help-debbugs@gnu.org Subject: [bug#44460] processes: Don't normalize Locks References: <87o8kcv30a.fsf@asu.edu> In-Reply-To: <87o8kcv30a.fsf@asu.edu> Resent-From: John Soo Original-Sender: "Debbugs-submit" Resent-CC: guix-patches@gnu.org Resent-Date: Thu, 05 Nov 2020 15:50:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 44460 X-GNU-PR-Package: guix-patches X-GNU-PR-Keywords: patch To: 44460@debbugs.gnu.org Received: via spool by 44460-submit@debbugs.gnu.org id=B44460.160459139426565 (code B ref 44460); Thu, 05 Nov 2020 15:50:02 +0000 Received: (at 44460) by debbugs.gnu.org; 5 Nov 2020 15:49:54 +0000 Received: from localhost ([127.0.0.1]:53890 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kahWL-0006uN-Sw for submit@debbugs.gnu.org; Thu, 05 Nov 2020 10:49:54 -0500 Received: from mail-pf1-f172.google.com ([209.85.210.172]:41176) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1kahWJ-0006u8-BJ for 44460@debbugs.gnu.org; Thu, 05 Nov 2020 10:49:52 -0500 Received: by mail-pf1-f172.google.com with SMTP id c20so1712747pfr.8 for <44460@debbugs.gnu.org>; Thu, 05 Nov 2020 07:49:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=asu-edu.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:mime-version; bh=ssvxzJ25+KPct7ekE1zy7PvsC+khKZoyXXv5suQF2gk=; b=gpOfaCDvqHtceRDKps05jWzaHpGlbEtBq5rxgsqvp053G+qF8aUeIzvD1IzAtqwZzn 8UL3HkqZSoPpvqZ7qBg7u9+JQ+NaUwPDc7WreVL0uwFYe7oNNtkcVgIcNx6ZOuSYDC47 Q2WfMSJ3ajxxfbwQlheAv7nDoAtqosbB2dbVOgYAgcqM3fw4Aq0b5SUy0Pb0s5jP1C4v 7HbioQ3C2Py+Ldu67Zl/AXfqpw0gPVEnOV+6gS7qH/Nqt1Te3slBzq7RDW9iw4UNksjh Tg8ijrWmG2VIHwpqgyediPlf0mqbbqGXkLdEC8Pw9zXjETuaau0N1F8JoN+/RCzExr0B U2Jg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version; bh=ssvxzJ25+KPct7ekE1zy7PvsC+khKZoyXXv5suQF2gk=; b=XmEsjbDj6EbGnfcdYVciTzO9gl1bXDBdeQqoMCzZxacYPmSkbCq+FBJ6AsLOtq6eCA gWmB0s2lyVpUaaFqSWUraL49zZtTgpCKVhD3viaxuDe7W5FkL934fzg5K2pkZamelUGd 7PHVmu4x9IGwEvopK0nvDUvfw+BGZ8Gmkyo6SYiDc7KWX9eV35Dvpbl6C2NPpDR3zzCD 7SFn/x2+J4DJUWViZ68YJpqhn7lW2+hYpP1PEL4pOu9Lq4NMI0EhwWTaSKHraU7479kN ao83mqxT6EGZfie/ZjqebLBUvgXdox2O45YTEZw2IlKyr1bw3KIObszxVimpP5iGGMwe 120A== X-Gm-Message-State: AOAM531LbJ8T/9w/LhN6OVbxL5M6y26zdRs40THaA7vZrdgD4bIHTFIi AGMy2xe5KLH7Ne3TJ1GEhTgj0PlrE4n4ZQ== X-Google-Smtp-Source: ABdhPJw7HE+/tQoLT1aG2hLVzlfZUhR+rrjJ3npQRS2NCmiRIc/8Q8zxBWdTO9BUaxx+Qgrqti4QiA== X-Received: by 2002:a63:ec0d:: with SMTP id j13mr2966904pgh.281.1604591384807; Thu, 05 Nov 2020 07:49:44 -0800 (PST) Received: from ecenter ([2600:1700:83b0:8bd0::7a8]) by smtp.gmail.com with ESMTPSA id m129sm3035264pfd.177.2020.11.05.07.49.43 for <44460@debbugs.gnu.org> (version=TLS1_2 cipher=ECDHE-ECDSA-CHACHA20-POLY1305 bits=256/256); Thu, 05 Nov 2020 07:49:43 -0800 (PST) From: John Soo Date: Thu, 05 Nov 2020 07:49:42 -0800 Message-ID: <87k0uzvm5l.fsf@asu.edu> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Spam-Score: -0.0 (/) X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-Spam-Score: -1.0 (-) X-BeenThere: guix-patches@gnu.org List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+larch=yhetil.org@gnu.org Sender: "Guix-patches" X-Scanner: ns3122888.ip-94-23-21.eu Authentication-Results: aspmx1.migadu.com; dkim=fail (body hash did not verify) header.d=asu-edu.20150623.gappssmtp.com header.s=20150623 header.b=gpOfaCDv; dmarc=fail reason="SPF not aligned (relaxed)" header.from=asu.edu (policy=none); spf=pass (aspmx1.migadu.com: domain of guix-patches-bounces@gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=guix-patches-bounces@gnu.org X-Spam-Score: 0.09 X-TUID: Jf/q9yxapSHy --=-=-= Content-Type: text/plain I got a little eager to normalize and put locks in their own record set. That was unnecessary as records can have multiple of the same field name. This new patch removes the Lock record set and puts the Lock in the Session record. - John --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-processes-Optionally-normalize-recutils-output.patch >From 699c66987885d91788ea0707a819270ca9fb2e1e Mon Sep 17 00:00:00 2001 From: John Soo Date: Wed, 4 Nov 2020 07:51:52 -0800 Subject: [PATCH] processes: Optionally normalize recutils output. * guix/scripts/processes.scm: Add "normalize" flag --- doc/guix.texi | 26 ++++++++++ guix/scripts/processes.scm | 103 ++++++++++++++++++++++++++++++++----- 2 files changed, 117 insertions(+), 12 deletions(-) diff --git a/doc/guix.texi b/doc/guix.texi index 5e3e0435b4..ed54c26072 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -12691,6 +12691,32 @@ ClientPID: 19419 ClientCommand: cuirass --cache-directory /var/cache/cuirass @dots{} @end example +Additional options are listed below. + +@table @code +@item --normalize +Normalize the output records into record sets (@pxref{Record Sets,,, +recutils, GNU recutils manual}). Normalizing into record sets allows +joins across record types. + +@example +$ guix processes --normalize | \ + recsel \ + -j Session \ + -t ChildProcess \ + -p Session.PID,PID \ + -e 'Session.ClientCommand ~ build' +Session_PID: 4278 +PID: 4435 + +Session_PID: 4278 +PID: 4554 + +Session_PID: 4278 +PID: 4646 +@end example +@end table + @node System Configuration @chapter System Configuration diff --git a/guix/scripts/processes.scm b/guix/scripts/processes.scm index b4ca7b1687..6828cf576e 100644 --- a/guix/scripts/processes.scm +++ b/guix/scripts/processes.scm @@ -176,6 +176,9 @@ active sessions, and the master 'guix-daemon' process." (values (filter-map child-process->session children) master))) +(define (lock->record lock port) + (format port "LockHeld: ~a~%" lock)) + (define (daemon-session->recutils session port) "Display SESSION information in recutils format on PORT." (format port "SessionPID: ~a~%" @@ -184,8 +187,7 @@ active sessions, and the master 'guix-daemon' process." (process-id (daemon-session-client session))) (format port "ClientCommand:~{ ~a~}~%" (process-command (daemon-session-client session))) - (for-each (lambda (lock) - (format port "LockHeld: ~a~%" lock)) + (for-each (lambda (lock) (lock->record lock port)) (daemon-session-locks-held session)) (for-each (lambda (process) (format port "ChildProcess: ~a:~{ ~a~}~%" @@ -193,6 +195,80 @@ active sessions, and the master 'guix-daemon' process." (process-command process))) (daemon-session-children session))) +(define (format-single-record port) + "Display denormalized session information to PORT." + (for-each (lambda (session) + (daemon-session->recutils session port) + (newline port)) + (daemon-sessions))) + +(define session-rec-type + ;; Also includes ClientCommand and LockHeld but it doesn't seem to be + ;; possible to express a plain string field (the default) without further + ;; restrictions + "%rec: Session +%type: PID int +%type: ClientPID int +%key: PID") + +(define child-process-rec-type + ;; Also includes Command but it doesn't seem to be possible to + ;; express a plain string field (the default) without further restrictions + "%rec: ChildProcess +%type: Session rec Session +%type: PID int +%key: PID") + +(define (session-key->field session port) + "Display SESSION PID as field on PORT." + (format + port "Session: ~a" + (process-id (daemon-session-process session)))) + +(define (session-scalars->normalized-record session port) + "Display SESSION scalar fields to PORT in normalized form." + (format port "PID: ~a~%" + (process-id (daemon-session-process session))) + (format port "ClientPID: ~a~%" + (process-id (daemon-session-client session))) + (format port "ClientCommand:~{ ~a~}~%" + (process-command (daemon-session-client session)))) + +(define (child-process->normalized-record process port) + "Display PROCESS record on PORT in normalized form" + (format port "PID: ~a" (process-id process)) + (newline port) + (format port "Command:~{ ~a~}" (process-command process))) + +(define (format-normalized port) + (define sessions (daemon-sessions)) + + (format port session-rec-type) + (newline port) + (newline port) + (for-each + (lambda (session) + (session-scalars->normalized-record session port) + (for-each (lambda (lock) (lock->record lock port)) + (daemon-session-locks-held session))) + sessions) + (newline port) + + (format port child-process-rec-type) + (newline port) + (newline port) + (for-each + (lambda (session) + (for-each + (lambda (process) + (session-key->field session port) + (newline port) + (child-process->normalized-record process port) + (newline port) + (newline port)) + (daemon-session-children session))) + sessions)) + ;;; ;;; Options. @@ -205,7 +281,10 @@ active sessions, and the master 'guix-daemon' process." (exit 0))) (option '(#\V "version") #f #f (lambda args - (show-version-and-exit "guix processes"))))) + (show-version-and-exit "guix processes"))) + (option '("normalize") #f #f + (lambda (opt name arg result) + (alist-cons 'normalize #t result))))) (define (show-help) (display (G_ "Usage: guix processes @@ -216,8 +295,13 @@ List the current Guix sessions and their processes.")) (display (G_ " -V, --version display version information and exit")) (newline) + (display (G_ " + --normalize display results as normalized record sets")) + (newline) (show-bug-report-information)) +(define %default-options '()) + ;;; ;;; Entry point. @@ -227,17 +311,12 @@ List the current Guix sessions and their processes.")) (category plumbing) (synopsis "list currently running sessions") (define options - (args-fold* args %options - (lambda (opt name arg result) - (leave (G_ "~A: unrecognized option~%") name)) - cons - '())) + (parse-command-line args %options (list %default-options))) (with-paginated-output-port port - (for-each (lambda (session) - (daemon-session->recutils session port) - (newline port)) - (daemon-sessions)) + (match (assoc-ref options 'normalize) + (#t (format-normalized port)) + (_ (format-single-record port))) ;; Pass 'R' (instead of 'r') so 'less' correctly estimates line length. #:less-options "FRX")) -- 2.29.1 --=-=-=--