Bevor ich abends den Computer ausschalte (besser: per Befehl ausschalten lasse), führe ich noch einige Wartungsarbeiten durch. Eines davon ist das Backup des Systems, aber auch die Aktualisierung des Systems. Für Debian ist dies mit apt recht leicht möglich und ebenso mit rustup/cargo für die Rust-Pakete. Nur fehlte mir bisher etwas für Emacs. Aber Emacs wäre nicht Emacs, wenn da nicht auch was ginge, und daher habe ich mir eine Funktion gebastelt, die ich ganz einfach von der Kommandozeile aus mit emacsclient --eval '(upgrade-packages)' aufrufen kann.

(defun upgrade-packages ()
  "Upgrade all packages

Usage: 'emacsclient --eval \"(upgrade-packages)\"'"
  (package-initialize)
  (package-list-packages t)
  (package-refresh-contents)
  (package-menu-mark-upgrades)

  ;; this is the essence from `package-autoremove`, because this sticks in prompt
  (let ((removable (package--removable-packages)))
    (when removable
      (mapc (lambda (p)
              (package-delete (cadr (assq p package-alist)) t))
            removable)))

  (prog1
      (package-menu-execute t)

    ; remove now obsolete packages
    (let ((removable (package--removable-packages)))
      (when removable
        (mapc (lambda (p)
                (package-delete (cadr (assq p package-alist)) t))
              removable)
        (package-menu-execute t)
      ))

    (quit-window))
  )

Entscheidend daran ist, dass die Funktion blockiert, bis alle Arbeiten abgeschlossen sind, damit der Befehl systemctl suspend nicht zu früh ausgeführt wird. Somit kann ich alle Wartungsarbeiten schön von der Shell aus koordiniert starten und mir ist egal, wie lange es braucht.