Function: proced-send-signal

proced-send-signal is an interactive and byte-compiled function defined in proced.el.gz.

Signature

(proced-send-signal &optional SIGNAL PROCESS-ALIST)

Documentation

Send a SIGNAL to processes in PROCESS-ALIST.

PROCESS-ALIST is an alist as returned by proced-marked-processes. Interactively, PROCESS-ALIST contains the marked processes. If no process is marked, it contains the process point is on, SIGNAL may be a string (HUP, INT, TERM, etc.) or a number. After sending SIGNAL to all processes in PROCESS-ALIST, this command runs the normal hook proced-after-send-signal-hook.

For backward compatibility SIGNAL and PROCESS-ALIST may be nil. Then PROCESS-ALIST contains the marked processes or the process point is on and SIGNAL is queried interactively. This noninteractive usage is still supported but discouraged. It will be removed in a future version of Emacs.

Key Bindings

Source Code

;; Defined in /usr/src/emacs/lisp/proced.el.gz
(defun proced-send-signal (&optional signal process-alist)
  "Send a SIGNAL to processes in PROCESS-ALIST.
PROCESS-ALIST is an alist as returned by `proced-marked-processes'.
Interactively, PROCESS-ALIST contains the marked processes.
If no process is marked, it contains the process point is on,
SIGNAL may be a string (HUP, INT, TERM, etc.) or a number.
After sending SIGNAL to all processes in PROCESS-ALIST, this command
runs the normal hook `proced-after-send-signal-hook'.

For backward compatibility SIGNAL and PROCESS-ALIST may be nil.
Then PROCESS-ALIST contains the marked processes or the process point is on
and SIGNAL is queried interactively.  This noninteractive usage is still
supported but discouraged.  It will be removed in a future version of Emacs."
  (interactive
   (let* ((process-alist (proced-marked-processes))
          (pnum (if (= 1 (length process-alist))
                    "1 process"
                  (format "%d processes" (length process-alist))))
          (completion-ignore-case t)
          (completion-extra-properties
           `(:annotation-function
             ,(lambda (s) (cdr (assoc s proced-signal-list))))))
     (proced-with-processes-buffer process-alist
       (list (completing-read (concat "Send signal [" pnum
                                      "] (default TERM): ")
                              proced-signal-list
                              nil nil nil nil "TERM")
             process-alist))))

  (unless (and signal process-alist)
    ;; Discouraged usage (supported for backward compatibility):
    ;; The new calling sequence separates more cleanly between the parts
    ;; of the code required for interactive and noninteractive calls so that
    ;; the command can be used more flexibly in noninteractive ways, too.
    (unless (get 'proced-send-signal 'proced-outdated)
       (put 'proced-send-signal 'proced-outdated t)
       (message "Outdated usage of `proced-send-signal'")
       (sit-for 2))
    (setq process-alist (proced-marked-processes))
    (unless signal
      (let ((pnum (if (= 1 (length process-alist))
                      "1 process"
                    (format "%d processes" (length process-alist))))
            (completion-ignore-case t)
            (completion-extra-properties
             `(:annotation-function
               ,(lambda (s) (cdr (assoc s proced-signal-list))))))
        (proced-with-processes-buffer process-alist
          (setq signal (completing-read (concat "Send signal [" pnum
                                                "] (default TERM): ")
                                        proced-signal-list
                                        nil nil nil nil "TERM"))))))

  (let (failures)
    ;; Why not always use `signal-process'?  See
    ;; https://lists.gnu.org/r/emacs-devel/2008-03/msg02955.html
    (if (functionp proced-signal-function)
        ;; use built-in `signal-process'
        (let ((signal (if (stringp signal)
                          (if (string-match "\\`[0-9]+\\'" signal)
                              (string-to-number signal)
                            (make-symbol signal))
                        signal)))   ; number
          (dolist (process process-alist)
            (condition-case err
                (unless (zerop (funcall
                                proced-signal-function (car process) signal))
                  (proced-log "%s\n" (cdr process))
                  (push (cdr process) failures))
              (error ; catch errors from failed signals
               (proced-log "%s\n" err)
               (proced-log "%s\n" (cdr process))
               (push (cdr process) failures)))))
      ;; use external system call
      (let ((signal (format "-%s" signal)))
        (dolist (process process-alist)
          (with-temp-buffer
            (condition-case nil
                (unless (zerop (call-process
                                proced-signal-function nil t nil
                                signal (number-to-string (car process))))
                  (proced-log (current-buffer))
                  (proced-log "%s\n" (cdr process))
                  (push (cdr process) failures))
              (error ; catch errors from failed signals
               (proced-log (current-buffer))
               (proced-log "%s\n" (cdr process))
               (push (cdr process) failures)))))))
    (if failures
        ;; Proced error message are not always very precise.
        ;; Can we issue a useful one-line summary in the
        ;; message area (using FAILURES) if only one signal failed?
        (proced-log-summary
         (format "Signal %s" signal)
         (format "%d of %d signal%s failed"
                 (length failures) (length process-alist)
                 (if (= 1 (length process-alist)) "" "s")))
      (proced-success-message "Sent signal to" (length process-alist))))
  ;; final clean-up
  (run-hooks 'proced-after-send-signal-hook))