[GRASS-dev] [GRASS GIS] #3295: GRASS GIS fails to start without terminal

#3295: GRASS GIS fails to start without terminal
-------------------------------------------------+-------------------------
Reporter: wenzeslaus | Owner: grass-dev@…
     Type: defect | Status: new
Priority: normal | Milestone: 7.4.0
Component: Startup | Version: unspecified
Keywords: gisset, wxGUI, init, grass.py, | CPU: Unspecified
  nohup, terminal, shell, GUI, CLI, exec, g.gui |
Platform: Linux |
-------------------------------------------------+-------------------------
On Ubuntu (16.04):

* Do Ctrl+F2 (window to directly run commands - rather than desktop
applications)
* Type grass
* Fill the startup screen
* Start session
* Start fails

In 7.2 you get error about g.extension (#3253) and trunk you don't get
anything (it fails later on).

It is reproducible with nohup:

{{{
nohup grass
}}}

Using `less nohup.out` you can get the output which mainly reveals:

{{{
ERROR: Variable 'LOCATION_NAME' not set
}}}

followed by

{{{
Traceback (most recent call last):
   File "/usr/lib/grass72/gui/wxpython/wxgui.py", line 158, in <module>
     sys.exit(main())
   File "/usr/lib/grass72/gui/wxpython/wxgui.py", line 145, in main
     app = GMApp(workspaceFile)
   File "/usr/lib/grass72/gui/wxpython/wxgui.py", line 48, in __init__
...
grass.exceptions.CalledModuleError: [it depends]
Traceback (most recent call last):
   File "/usr/lib/python2.7/atexit.py", line 24, in _run_exitfuncs
     func(*targs, **kargs)
PyAssertionError: C++ assertion "GetEventHandler() == this" failed at
../src/common/wincmn.cpp(478) in ~wxWindowBase(): any pushed event
handlers must have been removed
Error in sys.exitfunc:
Traceback (most recent call last):
   File "/usr/lib/python2.7/atexit.py", line 24, in _run_exitfuncs
     func(*targs, **kargs)
wx._core.PyAssertionError: C++ assertion "GetEventHandler() == this"
failed at ../src/common/wincmn.cpp(478) in ~wxWindowBase(): any pushed
event handlers must have been removed
}}}

Workaround which assumes you have some default mapset already:

{{{
grass --exec g.gui
}}}

Answer to the "What did you expect to happen?" question:

* GRASS GIS should start using this method as other applications do (e.g.
QGIS or Gimp).

Other possible improvements:

* Message saying that the session is not started instead of "Variable
'LOCATION_NAME' not set"
* Some temporary location generated for the case where there is not 'last
location used' so that `grass --exec g.gui` (or `grass --tmp-loc --exec
g.gui`) works on a fresh machine (it seems that the demolocation is not
part of the Ubuntu distribution)
* The above point and code packed into just `grass`. This comes to the
discussion about role of location at startup from different side. However,
it is pretty far from the core of this ticket which deals with GRASS GIS
running without terminal.

--
Ticket URL: <https://trac.osgeo.org/grass/ticket/3295&gt;
GRASS GIS <https://grass.osgeo.org>

#3295: GRASS GIS fails to start without terminal
-------------------------+-------------------------------------------------
  Reporter: wenzeslaus | Owner: grass-dev@…
      Type: defect | Status: new
  Priority: normal | Milestone: 7.4.0
Component: Startup | Version: unspecified
Resolution: | Keywords: gisset, wxGUI, init, grass.py,
       CPU: | nohup, terminal, shell, GUI, CLI, exec, g.gui
  Unspecified | Platform: Linux
-------------------------+-------------------------------------------------

Comment (by wenzeslaus):

From the nohup case I get the following in the output (as expected, I
suppose):

{{{
/bin/bash: error reading input file: Bad file descriptor
WARNING: Failed to start shell '/bin/bash'
}}}

With the following patch, nohup case actually runs.

{{{
#!diff
Index: grass.py

--- grass.py (revision 70649)
+++ grass.py (working copy)
@@ -1386,7 +1386,8 @@

      # Check for gui interface
      if grass_gui == "wxpython":
- Popen([os.getenv('GRASS_PYTHON'), wxpath("wxgui.py")])
+ return Popen([os.getenv('GRASS_PYTHON'), wxpath("wxgui.py")])
+ return None

  def close_gui():
@@ -1961,7 +1962,7 @@
                                              mapset_settings.location)

          # start GUI and register shell PID in rc file
- start_gui(grass_gui)
+ gui_process = start_gui(grass_gui)
          kv = read_gisrc(gisrc)
          kv['PID'] = str(shell_process.pid)
          write_gisrc(kv, gisrc)
@@ -1968,6 +1969,13 @@
          exit_val = shell_process.wait()
          if exit_val != 0:
              warning(_("Failed to start shell '%s'") % os.getenv('SHELL'))
+ # remove shell PID because GUI should not kill it
+ kv = read_gisrc(gisrc)
+ del kv['PID']
+ write_gisrc(kv, gisrc)
+ # if there is no shell but GUI is set, wait for that
+ if grass_gui != "text":
+ gui_process.wait()

          # close GUI if running
          close_gui()
}}}

However, with Ctrl+F2 I still get the same behavior. I don't see anything
helpful in the `sudo strace -p... -s9999 -e write` output (using PID of
`grass` and `gis_set.py`).

--
Ticket URL: <https://trac.osgeo.org/grass/ticket/3295#comment:1&gt;
GRASS GIS <https://grass.osgeo.org>

#3295: GRASS GIS fails to start without terminal
-------------------------+-------------------------------------------------
  Reporter: wenzeslaus | Owner: grass-dev@…
      Type: defect | Status: new
  Priority: normal | Milestone: 8.0.0
Component: Startup | Version: unspecified
Resolution: | Keywords: gisset, wxGUI, init, grass.py,
       CPU: | nohup, terminal, shell, GUI, CLI, exec, g.gui
  Unspecified | Platform: Linux
-------------------------+-------------------------------------------------
Changes (by wenzeslaus):

* milestone: 7.4.2 => 8.0.0

--
Ticket URL: <https://trac.osgeo.org/grass/ticket/3295#comment:4&gt;
GRASS GIS <https://grass.osgeo.org>

#3295: GRASS GIS fails to start without terminal
-------------------------+-------------------------------------------------
  Reporter: wenzeslaus | Owner: grass-dev@…
      Type: defect | Status: closed
  Priority: normal | Milestone: 8.0.0
Component: Startup | Version: unspecified
Resolution: fixed | Keywords: gisset, wxGUI, init, grass.py,
       CPU: | nohup, terminal, shell, GUI, CLI, exec, g.gui
  Unspecified | Platform: Linux
-------------------------+-------------------------------------------------
Changes (by wenzeslaus):

* status: new => closed
* resolution: => fixed

Comment:

Both cases, Ctrl+F2 and nohup, fixed by PR:768. Open new issues on !GitHub
in case there are follow up problems.

--
Ticket URL: <https://trac.osgeo.org/grass/ticket/3295#comment:5&gt;
GRASS GIS <https://grass.osgeo.org>