diff --git a/etc/xmobar.el b/etc/xmobar.el
--- a/etc/xmobar.el
+++ b/etc/xmobar.el
@@ -1,6 +1,6 @@
 ;; xmobar.el --- Display xmobar text output -*- lexical-binding: t -*-
 
-;; Copyright 2022 jao <jao@gnu.org>
+;; Copyright 2022, 2024 jao <jao@gnu.org>
 ;; Version: 0.0.1
 ;; Package-Requires: ((emacs "28.1"))
 ;; Keywords: unix
@@ -98,28 +98,33 @@
 
 (defun xmobar--update (update)
   "Apply an UPDATE to the xmobar bar."
-  (when xmobar-mode
-    (let* ((str (funcall xmobar--colorize-fn update))
+  (when (and xmobar-mode update)
+    (let* ((str (or (funcall xmobar--colorize-fn update) ""))
            (strs (and xmobar-tab-split (split-string str xmobar-tab-split))))
       (setq xmobar-string (if strs (cadr strs) str)
             xmobar--left-string (or (car strs) "")
-            xmobar--len (+ (string-width xmobar--left-string)
-                           (string-width xmobar-string))))
+            xmobar--len (+ (string-width (or xmobar--left-string ""))
+                           (string-width (or xmobar-string "")))))
     (force-mode-line-update t)))
 
 (defun xmobar--process-filter (proc string)
   "Process output from the xmobar process."
-  (let ((buf (process-buffer proc)))
-    (when (buffer-live-p buf)
-      (with-current-buffer buf
-        ;; Write the input to the buffer (might be partial).
-        (save-excursion
-          (goto-char (process-mark proc))
-          (insert string)
-          (set-marker (process-mark proc) (point)))
-        (when (string-match-p "\n$" string)
-          (xmobar--update (buffer-substring (point-min) (- (point-max) 1)))
-          (delete-region (point-min) (point-max)))))))
+  (when string
+    (let ((buf (process-buffer proc)))
+      (condition-case err
+          (when (buffer-live-p buf)
+            (with-current-buffer buf
+              ;; Write the input to the buffer (might be partial).
+              (save-excursion
+                (goto-char (process-mark proc))
+                (insert string)
+                (set-marker (process-mark proc) (point)))
+              (when (string-match-p "\n$" string)
+                (xmobar--update (buffer-substring (point-min) (- (point-max) 1)))
+                (delete-region (point-min) (point-max)))))
+        (error (message "Error running xmobar filter: %s"
+                        (error-message-string err))
+               (xmobar--stop))))))
 
 (defun xmobar--process-sentinel (proc status)
   "Handle events from the xmobar process (PROC).
diff --git a/src/Xmobar/Plugins/Monitors/Batt/Common.hs b/src/Xmobar/Plugins/Monitors/Batt/Common.hs
--- a/src/Xmobar/Plugins/Monitors/Batt/Common.hs
+++ b/src/Xmobar/Plugins/Monitors/Batt/Common.hs
@@ -1,7 +1,7 @@
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Plugins.Monitors.Batt.Common
--- Copyright   :  (c) 2010, 2011, 2012, 2013, 2015, 2016, 2018, 2019 Jose A Ortega
+-- Copyright   :  (c) 2010-2016, 2018, 2019, 2024 Jose A Ortega
 --                (c) 2010 Andrea Rossato, Petr Rockai
 -- License     :  BSD-style (see LICENSE)
 --
@@ -18,7 +18,7 @@
                                            , Status(..)
                                            , maybeAlert) where
 
-import System.Process (system)
+import System.Process (spawnCommand)
 import Control.Monad (unless, void)
 import Xmobar.Plugins.Monitors.Common
 
@@ -54,4 +54,4 @@
   case onLowAction opts of
     Nothing -> return ()
     Just x -> unless (isNaN left || actionThreshold opts < 100 * left)
-                $ void $ system x
+                $ void $ spawnCommand x
diff --git a/xmobar.cabal b/xmobar.cabal
--- a/xmobar.cabal
+++ b/xmobar.cabal
@@ -1,5 +1,5 @@
 name:               xmobar
-version:            0.47.3
+version:            0.47.4
 homepage:           https://codeberg.org/xmobar/xmobar
 synopsis:           A Minimalistic Text Based Status Bar
 description: 	    Xmobar is a minimalistic text based status bar.
