linux - Trying to find dbus session, doesent work

07
2014-07
  • AudioTroubler

    Trying to use notify-send with cron, it needs dbus, what im i doing wrong?

      var= $(set | grep '^DBUS_SESSION_BUS_ADDRESS=')
        export DBUS_SESSION_BUS_ADDRESS=$var
        #!/bin/sh
        {
    
            DISPLAY=:0 /usr/bin/notify-send  "testtest"
    
        } 
    
  • Answers
    Know someone who can answer? Share a link to this question via email, Google+, Twitter, or Facebook.

    Related Question

    linux - Updating screen session environment variables to reflect new graphical login?
  • Ryan Thompson

    I use linux, and I like to do all my command-line work within a single screen session, so that I can restart my graphical login and such without losing my terminals. However, when I log out and back into my graphical session, this changes all my session environment variables, such as DBus sessions. This means that after logging in again, my screen session now has the old (and wrong) environment variables. So now when I try to start graphical programs from my screen session, at best they emit a warning about not being able to connect to the session bus. At worst, they fail to start completely.

    So, what I'm looking for is a way to modify environment variables in a running instance of screen, so that all subsequently-created screen windows will inherit the new environment variables. Is there a way to do this?


  • Related Answers
  • Community

    You cannot start a shell script from the screen session since it would inherit the old environment. You can however us a fifo to get the new environment variables into the old screen session. You can fill that fifo when you start your graphical session.

    #!/bin/bash
    FIFO=/tmp/your_variables
    [ -e $FIFO ] && cat $FIFO > /dev/null || mkfifo $FIFO
    
    # save number of variables that follow
    NVARS=2
    echo $NVARS > $FIFO
    echo ENV1=sth1 > $FIFO
    echo ENV2=sth2 > $FIFO
    

    Start that script in the background on login (it will only terminate when all variables are read from it).

    Now you can read from the fifo, e.g. add this function to your .bashrc

    update_session() {
      FIFO=/tmp/your_variables
    
      NVAR=$(cat $FIFO)
      for i in $(seq $NVAR); do
        export $(cat $FIFO)
      done
      #delete the pipe, or it will not work next time 
      rm $FIFO
    }
    

    so that you can in your old screen session

    update_session
    
  • Ryan Thompson

    I have implemented a script to do this. You can get it here: https://github.com/DarwinAwardWinner/screen-sendenv

    After putting screen-sendenv.py into your $PATH, you can use the following snippet in your .bashrc:

    VARS_TO_UPDATE="DISPLAY DBUS_SESSION_BUS_ADDRESS SESSION_MANAGER GPG_AGENT_INFO"
    screen_pushenv () {
      screen-sendenv.py -t screen $VARS_TO_UPDATE
    }
    tmux_pushenv () {
      screen-sendenv.py -t tmux $VARS_TO_UPDATE
    }
    screen_pullenv () {
      tempfile=$(mktemp -q) && {
        for var in $VARS_TO_UPDATE; do
          screen sh -c "echo export $var=\$$var >> \"$tempfile\""
        done
        . "$tempfile"
        rm -f "$tempfile"
      }
    }
    tmux_pullenv () {
      for var in $VARS_TO_UPDATE; do
        expr="$(tmux showenv | grep "^$var=")"
        if [ -n "$expr" ]; then
          export "$expr"
        fi
      done
    }
    

    To use it, just run screen_pushenv before you run screen -r to reattach to your screen session. Then, after attaching with screen -r, you can update the environment in your existing shells with screen_pullenv. The tmux functions accomplish the same thing for tmux, another terminal multiplexer similar to screen.