Cleanly respawning xmobar when reload xmonad

9

1

This is just a small annoyance, but I've made the XMonad configuration file load xmobar using this code:

xmproc <- spawnPipe "/use/bin/xmobar ~/.xmobarrc"

It works well, but it spawn a new xmobar process every time XMonad is reloaded. I wonder if there's an easy way to kill the old one?

update: As suggested by entropo, I've created a bash script like this one:

#!/bin/bash

for PID in `pgrep xmobar`; do
    kill ${PID} > /dev/null &
done

/usr/bin/xmobar &

and call that script from XMonad configuration file.

Nicolas Buduroi

Posted 2011-04-08T20:39:27.297

Reputation: 357

Answers

3

Not xmonad specific, but you could launch xmobar through a shell script that checks for an existing xmobar process. See, e.g., http://bash.cyberciti.biz/web-server/restart-apache2-httpd-shell-script/

entropo

Posted 2011-04-08T20:39:27.297

Reputation: 655

15

If you have a shell script to start XMobar then you are 'doing it wrong'. You should be starting xmobar using the correct Haskell functions in the xmonad.hs config source file. Take a look at my configs main function:

-- put it all together
main = do
    nScreens <- countScreens    -- just in case you are on a laptop like me count the screens so that you can go
    xmonad =<< xmobar myBaseConfig
      { modMask = myModMask
      , workspaces = withScreens nScreens myWorkspaces
      , layoutHook = myLayoutHook nScreens
      , manageHook = myManageHook
      , borderWidth = myBorderWidth
      , normalBorderColor = myNormalBorderColor
      , focusedBorderColor = myFocusedBorderColor
      , keys = myKeys
      , mouseBindings = myMouseBindings
      , logHook = myLogHook
      }
    where
        myLogHook = dynamicLogXinerama

myBaseConfig = gnomeConfig

The salient line is this one:

xmonad =<< xmobar myBaseConfig

That runs xmobar as it should be run, even when you reload xmonad. You get the 'xmobar' function from the statement:

import XMonad.Hooks.DynamicLog (xmobar)

Which in turn comes from the xmonad-contrib package.

So you see, most things that you want to do with XMonad are already a solved problem, you just have to know where to look. Basically, just ditch your script and use that instead. I hope this helps.

Robert Massaioli

Posted 2011-04-08T20:39:27.297

Reputation: 744

For me this is creating 2 new processes each time I reload xmonad. Using spawnPipe creates 2 additional processes. ps -ax returns: "/bin/sh -c /.cabal/bin/xmobar ~/.xmobarrc:", "/bin/sh -c xmobar", "~/.cabal/bin/xmonad ~/.xmobarrc" and "xmobar". – fsanches – 2015-08-01T03:18:59.463

Reinstalling both fixed the issue in my commend above. – fsanches – 2015-08-01T03:42:52.113

1I'm pretty sure your spawnPipe will fork a process in a new thread. If you want to make spawnPipe create a child process instead (one that closes when the main process does), I'm afraid you'll have to write your own spawnPipe function. – YoYoYonnY – 2017-05-06T02:04:53.250

XMonad.Hooks.DynamicLog.xmobar is defined in terms of spawnPipe... – bcc32 – 2018-05-14T05:17:18.903

I tried n solutions already and none fixed the problem, the previous xmobar process isn't killed. The only way I could manage that was spawning a killall "xmobar" command. – ptkato – 2018-08-24T18:42:20.893

An important point which was not mentioned is that you must have Run StdinReader (or Run UnsafeStdinReader) in your xmobar config. The StdinReader implementation makes xmobar exit when it sees EOF on its stdin, which happens when xmonad closes its end of pipe during the restart. – Sergey Vlasov – 2019-02-15T12:31:11.343

2Well, I've found the spawnPipe code on the XMonad website, it's really not easy to know where to look! But in the end, I prefer the technique I'm using as it is cleaner, using DynamicLog didn't kill the old process in my tests. I really like XMonad, but Haskell is not a good configuration language. – Nicolas Buduroi – 2011-04-10T15:21:49.660

1Okay, whatever works for you is good in the end. But I think you are thinking about it wrong. You do not configure XMonad: you extend it. Haskell the prefect fit for extension. – Robert Massaioli – 2011-04-10T23:00:59.093