Run a dbus program in crontab , how to know about the SESSION id?

The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP












17















I need to run some program within crontab , but how can the program know about dbus session id ? it's only available for programs launched by session managers.










share|improve this question


























    17















    I need to run some program within crontab , but how can the program know about dbus session id ? it's only available for programs launched by session managers.










    share|improve this question
























      17












      17








      17


      7






      I need to run some program within crontab , but how can the program know about dbus session id ? it's only available for programs launched by session managers.










      share|improve this question














      I need to run some program within crontab , but how can the program know about dbus session id ? it's only available for programs launched by session managers.







      kde d-bus






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Jan 6 '12 at 15:32









      daisydaisy

      28.6k49169302




      28.6k49169302




















          5 Answers
          5






          active

          oldest

          votes


















          21














          The problem is somewhat similar to accessing the X display and finding the location of the X cookie file. (Also, refer to these questions if you want to launch a GUI program on the user's display.)



          Dbus stores the session address in a file in ~/.dbus/session-bus. The name of the file is $machine_id-$display_number, where $machine_id is a randomly generated number stored in /var/lib/dbus/machine-id and $display_number is the X display number ($DISPLAY is :$display_number or :$display_number.$screen_number). The file in ~/.dbus/session-bus is parseable by a shell and contains definitions for DBUS_SESSION_BUS_ADDRESS and DBUS_SESSION_BUS_PID.



          dbus_session_file=~/.dbus/session-bus/$(cat /var/lib/dbus/machine-id)-0
          if [ -e "$dbus_session_file" ]; then
          . "$dbus_session_file"
          export DBUS_SESSION_BUS_ADDRESS DBUS_SESSION_BUS_PID
          dbus-send …
          fi


          Beware that there's no guarantee that the dbus daemon is still available. The user may have logged out.



          An alternative method is to find the PID of a process in the desktop session, and obtain the dbus address from its environment.



          export $(</proc/$pid/environ tr \0 \n | grep -E '^DBUS_SESSION_BUS_ADDRESS=')


          If the crontab is running as root and you want to communicate with the session of whatever user is logged in on the console, see Can I launch a graphical program on another user's desktop as root?






          share|improve this answer
































            2














            I think if you know the pid of the gnome session manager, then you read the environment from /proc filesystem.



            GNOME_SESSION_PID=<PID_OF_GNOME_SESSION> 
            READ_SESSION_COOKIE="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$GNOME_SESSION_PID/environ|cut -d= -f2-)"


            Use the SESSION id then, with other programs like notify-send or dbus* tools.



            Cheers.






            share|improve this answer

























            • very impressive , actually i'm running KDE4 , so i looked for plasma-desktop instead, thanks !

              – daisy
              Jan 7 '12 at 0:13


















            1














            ps -u yourlogin e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]10' | tail -c35





            share|improve this answer






























              1














              I can't comment on Vincenzo's answer, but I find his answer works best for me on KDE4.



              I've had to slightly modify the command though. For me it's:



              ps -u yourlogin e | grep -Eo 'dbus-daemon.*ADDRESS=unix:abstract=/tmp/dbus-[A-Za-z0-9]10' | tail -c35


              Notice ADDRESS in capital letters.






              share|improve this answer
































                0














                Yes DBus must have a x session.
                Like earlier answers, 'DBUS_SESSION_BUS_ADDRESS' must have a value before starting . However, you could use 'dbus-launch' to create this value. Following snippet could be put in a script called from crontab.



                if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
                eval `dbus-launch --sh-syntax`
                fi
                echo "D-Bus daemon address is:"
                echo "$DBUS_SESSION_BUS_ADDRESS"

                # -E to export DBUS_SESSION_BUS_ADDRESS. Crucial to make DBUS work.
                sudo -u <user> -E <program>


                One setback with this solution is that the session might hang around after you've stopped your software.






                share|improve this answer






















                  Your Answer








                  StackExchange.ready(function()
                  var channelOptions =
                  tags: "".split(" "),
                  id: "106"
                  ;
                  initTagRenderer("".split(" "), "".split(" "), channelOptions);

                  StackExchange.using("externalEditor", function()
                  // Have to fire editor after snippets, if snippets enabled
                  if (StackExchange.settings.snippets.snippetsEnabled)
                  StackExchange.using("snippets", function()
                  createEditor();
                  );

                  else
                  createEditor();

                  );

                  function createEditor()
                  StackExchange.prepareEditor(
                  heartbeatType: 'answer',
                  autoActivateHeartbeat: false,
                  convertImagesToLinks: false,
                  noModals: true,
                  showLowRepImageUploadWarning: true,
                  reputationToPostImages: null,
                  bindNavPrevention: true,
                  postfix: "",
                  imageUploader:
                  brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                  contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                  allowUrls: true
                  ,
                  onDemand: true,
                  discardSelector: ".discard-answer"
                  ,immediatelyShowMarkdownHelp:true
                  );



                  );













                  draft saved

                  draft discarded


















                  StackExchange.ready(
                  function ()
                  StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f28463%2frun-a-dbus-program-in-crontab-how-to-know-about-the-session-id%23new-answer', 'question_page');

                  );

                  Post as a guest















                  Required, but never shown

























                  5 Answers
                  5






                  active

                  oldest

                  votes








                  5 Answers
                  5






                  active

                  oldest

                  votes









                  active

                  oldest

                  votes






                  active

                  oldest

                  votes









                  21














                  The problem is somewhat similar to accessing the X display and finding the location of the X cookie file. (Also, refer to these questions if you want to launch a GUI program on the user's display.)



                  Dbus stores the session address in a file in ~/.dbus/session-bus. The name of the file is $machine_id-$display_number, where $machine_id is a randomly generated number stored in /var/lib/dbus/machine-id and $display_number is the X display number ($DISPLAY is :$display_number or :$display_number.$screen_number). The file in ~/.dbus/session-bus is parseable by a shell and contains definitions for DBUS_SESSION_BUS_ADDRESS and DBUS_SESSION_BUS_PID.



                  dbus_session_file=~/.dbus/session-bus/$(cat /var/lib/dbus/machine-id)-0
                  if [ -e "$dbus_session_file" ]; then
                  . "$dbus_session_file"
                  export DBUS_SESSION_BUS_ADDRESS DBUS_SESSION_BUS_PID
                  dbus-send …
                  fi


                  Beware that there's no guarantee that the dbus daemon is still available. The user may have logged out.



                  An alternative method is to find the PID of a process in the desktop session, and obtain the dbus address from its environment.



                  export $(</proc/$pid/environ tr \0 \n | grep -E '^DBUS_SESSION_BUS_ADDRESS=')


                  If the crontab is running as root and you want to communicate with the session of whatever user is logged in on the console, see Can I launch a graphical program on another user's desktop as root?






                  share|improve this answer





























                    21














                    The problem is somewhat similar to accessing the X display and finding the location of the X cookie file. (Also, refer to these questions if you want to launch a GUI program on the user's display.)



                    Dbus stores the session address in a file in ~/.dbus/session-bus. The name of the file is $machine_id-$display_number, where $machine_id is a randomly generated number stored in /var/lib/dbus/machine-id and $display_number is the X display number ($DISPLAY is :$display_number or :$display_number.$screen_number). The file in ~/.dbus/session-bus is parseable by a shell and contains definitions for DBUS_SESSION_BUS_ADDRESS and DBUS_SESSION_BUS_PID.



                    dbus_session_file=~/.dbus/session-bus/$(cat /var/lib/dbus/machine-id)-0
                    if [ -e "$dbus_session_file" ]; then
                    . "$dbus_session_file"
                    export DBUS_SESSION_BUS_ADDRESS DBUS_SESSION_BUS_PID
                    dbus-send …
                    fi


                    Beware that there's no guarantee that the dbus daemon is still available. The user may have logged out.



                    An alternative method is to find the PID of a process in the desktop session, and obtain the dbus address from its environment.



                    export $(</proc/$pid/environ tr \0 \n | grep -E '^DBUS_SESSION_BUS_ADDRESS=')


                    If the crontab is running as root and you want to communicate with the session of whatever user is logged in on the console, see Can I launch a graphical program on another user's desktop as root?






                    share|improve this answer



























                      21












                      21








                      21







                      The problem is somewhat similar to accessing the X display and finding the location of the X cookie file. (Also, refer to these questions if you want to launch a GUI program on the user's display.)



                      Dbus stores the session address in a file in ~/.dbus/session-bus. The name of the file is $machine_id-$display_number, where $machine_id is a randomly generated number stored in /var/lib/dbus/machine-id and $display_number is the X display number ($DISPLAY is :$display_number or :$display_number.$screen_number). The file in ~/.dbus/session-bus is parseable by a shell and contains definitions for DBUS_SESSION_BUS_ADDRESS and DBUS_SESSION_BUS_PID.



                      dbus_session_file=~/.dbus/session-bus/$(cat /var/lib/dbus/machine-id)-0
                      if [ -e "$dbus_session_file" ]; then
                      . "$dbus_session_file"
                      export DBUS_SESSION_BUS_ADDRESS DBUS_SESSION_BUS_PID
                      dbus-send …
                      fi


                      Beware that there's no guarantee that the dbus daemon is still available. The user may have logged out.



                      An alternative method is to find the PID of a process in the desktop session, and obtain the dbus address from its environment.



                      export $(</proc/$pid/environ tr \0 \n | grep -E '^DBUS_SESSION_BUS_ADDRESS=')


                      If the crontab is running as root and you want to communicate with the session of whatever user is logged in on the console, see Can I launch a graphical program on another user's desktop as root?






                      share|improve this answer















                      The problem is somewhat similar to accessing the X display and finding the location of the X cookie file. (Also, refer to these questions if you want to launch a GUI program on the user's display.)



                      Dbus stores the session address in a file in ~/.dbus/session-bus. The name of the file is $machine_id-$display_number, where $machine_id is a randomly generated number stored in /var/lib/dbus/machine-id and $display_number is the X display number ($DISPLAY is :$display_number or :$display_number.$screen_number). The file in ~/.dbus/session-bus is parseable by a shell and contains definitions for DBUS_SESSION_BUS_ADDRESS and DBUS_SESSION_BUS_PID.



                      dbus_session_file=~/.dbus/session-bus/$(cat /var/lib/dbus/machine-id)-0
                      if [ -e "$dbus_session_file" ]; then
                      . "$dbus_session_file"
                      export DBUS_SESSION_BUS_ADDRESS DBUS_SESSION_BUS_PID
                      dbus-send …
                      fi


                      Beware that there's no guarantee that the dbus daemon is still available. The user may have logged out.



                      An alternative method is to find the PID of a process in the desktop session, and obtain the dbus address from its environment.



                      export $(</proc/$pid/environ tr \0 \n | grep -E '^DBUS_SESSION_BUS_ADDRESS=')


                      If the crontab is running as root and you want to communicate with the session of whatever user is logged in on the console, see Can I launch a graphical program on another user's desktop as root?







                      share|improve this answer














                      share|improve this answer



                      share|improve this answer








                      edited Apr 13 '17 at 12:36









                      Community

                      1




                      1










                      answered Jan 7 '12 at 1:25









                      GillesGilles

                      532k12810681594




                      532k12810681594























                          2














                          I think if you know the pid of the gnome session manager, then you read the environment from /proc filesystem.



                          GNOME_SESSION_PID=<PID_OF_GNOME_SESSION> 
                          READ_SESSION_COOKIE="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$GNOME_SESSION_PID/environ|cut -d= -f2-)"


                          Use the SESSION id then, with other programs like notify-send or dbus* tools.



                          Cheers.






                          share|improve this answer

























                          • very impressive , actually i'm running KDE4 , so i looked for plasma-desktop instead, thanks !

                            – daisy
                            Jan 7 '12 at 0:13















                          2














                          I think if you know the pid of the gnome session manager, then you read the environment from /proc filesystem.



                          GNOME_SESSION_PID=<PID_OF_GNOME_SESSION> 
                          READ_SESSION_COOKIE="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$GNOME_SESSION_PID/environ|cut -d= -f2-)"


                          Use the SESSION id then, with other programs like notify-send or dbus* tools.



                          Cheers.






                          share|improve this answer

























                          • very impressive , actually i'm running KDE4 , so i looked for plasma-desktop instead, thanks !

                            – daisy
                            Jan 7 '12 at 0:13













                          2












                          2








                          2







                          I think if you know the pid of the gnome session manager, then you read the environment from /proc filesystem.



                          GNOME_SESSION_PID=<PID_OF_GNOME_SESSION> 
                          READ_SESSION_COOKIE="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$GNOME_SESSION_PID/environ|cut -d= -f2-)"


                          Use the SESSION id then, with other programs like notify-send or dbus* tools.



                          Cheers.






                          share|improve this answer















                          I think if you know the pid of the gnome session manager, then you read the environment from /proc filesystem.



                          GNOME_SESSION_PID=<PID_OF_GNOME_SESSION> 
                          READ_SESSION_COOKIE="$(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$GNOME_SESSION_PID/environ|cut -d= -f2-)"


                          Use the SESSION id then, with other programs like notify-send or dbus* tools.



                          Cheers.







                          share|improve this answer














                          share|improve this answer



                          share|improve this answer








                          edited Jan 6 '12 at 16:43

























                          answered Jan 6 '12 at 16:27









                          Nikhil MulleyNikhil Mulley

                          6,3472245




                          6,3472245












                          • very impressive , actually i'm running KDE4 , so i looked for plasma-desktop instead, thanks !

                            – daisy
                            Jan 7 '12 at 0:13

















                          • very impressive , actually i'm running KDE4 , so i looked for plasma-desktop instead, thanks !

                            – daisy
                            Jan 7 '12 at 0:13
















                          very impressive , actually i'm running KDE4 , so i looked for plasma-desktop instead, thanks !

                          – daisy
                          Jan 7 '12 at 0:13





                          very impressive , actually i'm running KDE4 , so i looked for plasma-desktop instead, thanks !

                          – daisy
                          Jan 7 '12 at 0:13











                          1














                          ps -u yourlogin e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]10' | tail -c35





                          share|improve this answer



























                            1














                            ps -u yourlogin e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]10' | tail -c35





                            share|improve this answer

























                              1












                              1








                              1







                              ps -u yourlogin e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]10' | tail -c35





                              share|improve this answer













                              ps -u yourlogin e | grep -Eo 'dbus-daemon.*address=unix:abstract=/tmp/dbus-[A-Za-z0-9]10' | tail -c35






                              share|improve this answer












                              share|improve this answer



                              share|improve this answer










                              answered Jun 17 '14 at 13:32









                              VincenzoVincenzo

                              111




                              111





















                                  1














                                  I can't comment on Vincenzo's answer, but I find his answer works best for me on KDE4.



                                  I've had to slightly modify the command though. For me it's:



                                  ps -u yourlogin e | grep -Eo 'dbus-daemon.*ADDRESS=unix:abstract=/tmp/dbus-[A-Za-z0-9]10' | tail -c35


                                  Notice ADDRESS in capital letters.






                                  share|improve this answer





























                                    1














                                    I can't comment on Vincenzo's answer, but I find his answer works best for me on KDE4.



                                    I've had to slightly modify the command though. For me it's:



                                    ps -u yourlogin e | grep -Eo 'dbus-daemon.*ADDRESS=unix:abstract=/tmp/dbus-[A-Za-z0-9]10' | tail -c35


                                    Notice ADDRESS in capital letters.






                                    share|improve this answer



























                                      1












                                      1








                                      1







                                      I can't comment on Vincenzo's answer, but I find his answer works best for me on KDE4.



                                      I've had to slightly modify the command though. For me it's:



                                      ps -u yourlogin e | grep -Eo 'dbus-daemon.*ADDRESS=unix:abstract=/tmp/dbus-[A-Za-z0-9]10' | tail -c35


                                      Notice ADDRESS in capital letters.






                                      share|improve this answer















                                      I can't comment on Vincenzo's answer, but I find his answer works best for me on KDE4.



                                      I've had to slightly modify the command though. For me it's:



                                      ps -u yourlogin e | grep -Eo 'dbus-daemon.*ADDRESS=unix:abstract=/tmp/dbus-[A-Za-z0-9]10' | tail -c35


                                      Notice ADDRESS in capital letters.







                                      share|improve this answer














                                      share|improve this answer



                                      share|improve this answer








                                      edited Apr 13 '17 at 12:36









                                      Community

                                      1




                                      1










                                      answered Apr 22 '16 at 9:53









                                      noricnoric

                                      111




                                      111





















                                          0














                                          Yes DBus must have a x session.
                                          Like earlier answers, 'DBUS_SESSION_BUS_ADDRESS' must have a value before starting . However, you could use 'dbus-launch' to create this value. Following snippet could be put in a script called from crontab.



                                          if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
                                          eval `dbus-launch --sh-syntax`
                                          fi
                                          echo "D-Bus daemon address is:"
                                          echo "$DBUS_SESSION_BUS_ADDRESS"

                                          # -E to export DBUS_SESSION_BUS_ADDRESS. Crucial to make DBUS work.
                                          sudo -u <user> -E <program>


                                          One setback with this solution is that the session might hang around after you've stopped your software.






                                          share|improve this answer



























                                            0














                                            Yes DBus must have a x session.
                                            Like earlier answers, 'DBUS_SESSION_BUS_ADDRESS' must have a value before starting . However, you could use 'dbus-launch' to create this value. Following snippet could be put in a script called from crontab.



                                            if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
                                            eval `dbus-launch --sh-syntax`
                                            fi
                                            echo "D-Bus daemon address is:"
                                            echo "$DBUS_SESSION_BUS_ADDRESS"

                                            # -E to export DBUS_SESSION_BUS_ADDRESS. Crucial to make DBUS work.
                                            sudo -u <user> -E <program>


                                            One setback with this solution is that the session might hang around after you've stopped your software.






                                            share|improve this answer

























                                              0












                                              0








                                              0







                                              Yes DBus must have a x session.
                                              Like earlier answers, 'DBUS_SESSION_BUS_ADDRESS' must have a value before starting . However, you could use 'dbus-launch' to create this value. Following snippet could be put in a script called from crontab.



                                              if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
                                              eval `dbus-launch --sh-syntax`
                                              fi
                                              echo "D-Bus daemon address is:"
                                              echo "$DBUS_SESSION_BUS_ADDRESS"

                                              # -E to export DBUS_SESSION_BUS_ADDRESS. Crucial to make DBUS work.
                                              sudo -u <user> -E <program>


                                              One setback with this solution is that the session might hang around after you've stopped your software.






                                              share|improve this answer













                                              Yes DBus must have a x session.
                                              Like earlier answers, 'DBUS_SESSION_BUS_ADDRESS' must have a value before starting . However, you could use 'dbus-launch' to create this value. Following snippet could be put in a script called from crontab.



                                              if test -z "$DBUS_SESSION_BUS_ADDRESS" ; then
                                              eval `dbus-launch --sh-syntax`
                                              fi
                                              echo "D-Bus daemon address is:"
                                              echo "$DBUS_SESSION_BUS_ADDRESS"

                                              # -E to export DBUS_SESSION_BUS_ADDRESS. Crucial to make DBUS work.
                                              sudo -u <user> -E <program>


                                              One setback with this solution is that the session might hang around after you've stopped your software.







                                              share|improve this answer












                                              share|improve this answer



                                              share|improve this answer










                                              answered Jan 8 at 6:24









                                              karnbokarnbo

                                              1




                                              1



























                                                  draft saved

                                                  draft discarded
















































                                                  Thanks for contributing an answer to Unix & Linux Stack Exchange!


                                                  • Please be sure to answer the question. Provide details and share your research!

                                                  But avoid


                                                  • Asking for help, clarification, or responding to other answers.

                                                  • Making statements based on opinion; back them up with references or personal experience.

                                                  To learn more, see our tips on writing great answers.




                                                  draft saved


                                                  draft discarded














                                                  StackExchange.ready(
                                                  function ()
                                                  StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f28463%2frun-a-dbus-program-in-crontab-how-to-know-about-the-session-id%23new-answer', 'question_page');

                                                  );

                                                  Post as a guest















                                                  Required, but never shown





















































                                                  Required, but never shown














                                                  Required, but never shown












                                                  Required, but never shown







                                                  Required, but never shown

































                                                  Required, but never shown














                                                  Required, but never shown












                                                  Required, but never shown







                                                  Required, but never shown






                                                  Popular posts from this blog

                                                  How to check contact read email or not when send email to Individual?

                                                  Displaying single band from multi-band raster using QGIS

                                                  How many registers does an x86_64 CPU actually have?