Προς το περιεχόμενο

Πρόβλημα με launcher σε Ubuntu...όποιος το βρει κερδίζει λουκούμι!


Dr.Fuzzy

Προτεινόμενες αναρτήσεις

Λοιπόν συνοπτικά, προσπαθώ να φτιάξω έναν launcher για να ξεκινάει ένα εργαλείο που χρησιμοποιώ, συγκεκριμένα το Modelsim. Στην πραγματικότητα είναι κάτι πολύ απλό και όμως με το συγκεκριμένο εργαλείο δεν δουλεύει! Πιο συγκεκριμένα o launcher είναι ως εξής:

 

Type: Application in Terminal

Name: Modelsim 6.5

Command: sh -c '/opt/modelsim-6.5/modeltech/bin/vsim'

Comment: Launch Modelsim 6.5

 

ή

 

>
#!/usr/bin/env xdg-open

[Desktop Entry]
Version=1.0
Type=Application
Terminal=true
Icon[en_US]=gnome-panel-launcher
Name[en_US]=Modelsim 6.5
Exec=sh -c '/opt/modelsim-6.5/modeltech/bin/vsim'
Comment[en_US]=Launch Modelsim 6.5
Name=Modelsim 6.5
Comment=Launch Modelsim 6.5
Icon=gnome-panel-launcher

 

δυστυχώς το μόνο που γίνεται όταν το κάνω double-click είναι να ανοίγει ένα terminal για μισό δευτερόλεπτο και να κλείνει αμέσως μετά.

Έχω δοκιμάσει σχεδόν τα πάντα, όπως Terminal=false, χωρίς sh, με csh, tcsh, και τίποτα! Από κονσόλα φυσικά τρέχει κανονικά. Παραθέτω επίσης και το script του vsim μήπως και βοηθήσει:

 

>
#!/bin/sh
#
#Copyright 1991-2009 Mentor Graphics Corporation
#
#All Rights Reserved.
#
#THIS WORK CONTAINS TRADE SECRET AND PROPRIETARY INFORMATION WHICH IS THE PROPERTY OF 
#MENTOR GRAPHICS CORPORATION OR ITS LICENSORS AND IS SUBJECT TO LICENSE TERMS.
#

# MTI_VCO_MODE environment variable may be set to "32" or "64"
# to force selection of 32-bit or 64-bit platform directory for executables.
mode=${MTI_VCO_MODE:-""}

PATH="/bin:$PATH"

arg0=$0
cmd=`basename $arg0`

uname=`uname`
utype=`uname -r`
umach=`uname -m`

case $uname in
 AIX)
   islink=-L
   ;;
 CYGWIN_NT*)
   arg0=`dirname $arg0`
   islink=-h
   ;;
 *)
   islink=-h
   ;;
esac

while [ $islink $arg0 ] ; do
 x=`/bin/ls -ld $arg0`
 x=`expr "$x" : '.* \(.*\)'`
 case $x in
   /*) arg0=$x                 ;;
   *)  arg0=`dirname $arg0`/$x ;;
 esac
done

dir=`dirname $arg0`

vco=${uname}${utype}
case $vco in
 SunOS4*)
   echo "Error: $cmd is not supported on ${uname} ${utype}"
   exit 1
   ;;
 SunOS5.5*)
   echo "Error: $cmd is not supported on ${uname} ${utype}"
   exit 1
   ;;
 SunOS5.6*)
   echo "Error: $cmd is not supported on ${uname} ${utype}"
   exit 1
   ;;
 SunOS5.7*)
   echo "Error: $cmd is not supported on ${uname} ${utype}"
   exit 1
   ;;
 SunOS5*)
   # Use 64-bit platform only if 32-bit is not installed and OS and cpu
   # support 64-bit. User may set PATH to platform-specific directory or set
   # environment variable MTI_VCO_MODE to 32 or 64 to override default
   # behavior.
   #
   if [ -x /bin/isainfo ] ; then
     isa="`/bin/isainfo -n 2>&1`"
   else
     isa=""
   fi
   case $mode.$isa in
     32.amd*)          vco="sunos5x86"         ;;
     64.amd*)          vco="sunos5x86_64"      ;;
     .amd32*)          vco="sunos5x86"         ;;
     .amd*)
      if [ -x /bin/getconf ] \
       && /bin/getconf _XBS5_LP64_OFF64 > /dev/null 2>&1 \
       && [ ! -x $dir/sunos5x86/vsim ] \
       && [ -x $dir/sunos5x86_64/vsim ] ; then
         vco="sunos5x86_64"
       else
         vco="sunos5x86"
       fi
       ;;
     32.i386*)         vco="sunos5x86"         ;;
     64.i386*)         vco="sunos5x86_64"      ;;
     .i386*)
       if [ -x /bin/getconf ] \
       && /bin/getconf _XBS5_LP64_OFF64 > /dev/null 2>&1 \
       && [ ! -x $dir/sunos5x86/vsim ] \
       && [ -x $dir/sunos5x86_64/vsim ] ; then
         vco="sunos5x86_64"
       else
         vco="sunos5x86"
       fi
       ;;
     32.sparc*)        vco="sunos5"            ;;
     64.sparc*)        vco="sunos5v9"          ;;
     .sparcv9*)
       if [ -x /bin/getconf ] \
       && /bin/getconf _XBS5_LP64_OFF64 > /dev/null 2>&1 \
       && [ ! -x $dir/sunos5/vsim ] \
       && [ -x $dir/sunos5v9/vsim ] ; then
         vco="sunos5v9"
       else
         vco="sunos5"
       fi
       ;;
     *)                vco="sunos5"            ;;
   esac
   ;;
 HP-UX*)
   # Use hpux_ia64 if IA-64 architecture.
   #
   # Use hppa64 platform only if hp700 is not installed
   # and OS and cpu support 64-bit. User should set PATH to
   # platform-specific directory to override default behavior.
   #
   # Use hp700_1020 platform only if hp700 is not installed
   # and hppa64 is not installed or OS/CPU doesn't support it.
   if [ "$mode" != "32"  ]           \
   && [ "$umach" = "ia64" ]          \
   && ( [ "$mode" = "64" ]           \
     || [ -x $dir/hpux_$umach/vsim ] \
     || [ ! -x $dir/hp700/vsim ] ) ; then
     vco="hpux_ia64"
   elif [ "$mode" != "32"  ]         \
     && [ "$umach" != "ia64" ]       \
     && ( [ "$mode" = "64" ]         \
       || ( [ ! -x $dir/hp700/vsim ] \
         && [ -x $dir/hppa64/vsim ]  \
         && [ -x /bin/getconf ]      \
         && [ "`/bin/getconf KERNEL_BITS 2>&1`" = "64" ] ) ) ; then
     vco="hppa64"
   elif [ ! -x $dir/hp700/vsim ] \
     && [ -x $dir/hp700_1020/vsim ] ; then
     vco="hp700_1020"
   else
     vco="hp700"
   fi
   ;;
 AIX*)
   # Use rs64 platform only if rs6000 is not installed
   # and OS and cpu support 64-bit. User should set PATH to
   # platform-specific directory to override default behavior.
   if [ "$mode" != "32"  ]                                 \
   && ( [ "$mode" = "64" ]                                 \
     || ( [ ! -x $dir/rs6000/vsim ]                        \
       && [ -x $dir/rs64/vsim ]                            \
       && [ -x /bin/getconf ]                              \
       && [ "`/bin/getconf _XBS5_LP64_OFF64 2>&1`" = "1" ] \
       && /bin/locale64 > /dev/null 2>&1 ) ) ; then
     vco="rs64"
   else
     vco="rs6000"
   fi
   ;;
 Linux*)
   # If IA-64 or X86-64 architecture and machine-specific vsim is not
   # installed but linux vsim is available, use linux platform.
   # Otherwise use machine-specific platform.
   #
   if [ "$mode" != "32"  ]            \
   && ( [ "$umach" = "ia64" ]         \
     || [ "$umach" = "x86_64" ] )     \
   && ( [ "$mode" = "64" ]            \
     || [ -x $dir/linux_$umach/vsim ] \
     || [ ! -x $dir/linux/vsim ] ) ; then
     if [ "$umach" = "ia64" ] && [ -x $dir/linux_ia64_gcc3/vsim ]; then
       vco="linux_ia64_gcc3"
     else
       vco="linux_$umach"
     fi
   else
     if [ "$mode" != "64" ] \
         && [ -x $dir/linux_gcc3/vsim ] \
         && [ ! -x $dir/linux/vsim ]; then
       vco="linux_gcc3"
     else
       case $utype in
         2.4.[7-9]*)       vco="linux" ;;
         2.4.[1-9][0-9]*)  vco="linux" ;;
         2.[5-9]*)         vco="linux" ;;
         2.[1-9][0-9]*)    vco="linux" ;;
         *)                vco="linux_rh60" ;;
       esac
     fi
   fi
   ;;
 Win*)
   if [ "$mode" = "64" ] ; then
     echo "Error: 64 bit $cmd is not supported on ${uname}"
     exit 1
   fi
   vco="win32"
   ;;
 CYGWIN_NT*)
   # Cygwin environment on a Windows platform
   if [ "$mode" = "64" ] ; then
     echo "Error: 64 bit $cmd is not supported on ${uname}"
     exit 1
   fi
   vco="win32"
   ;;
*)
   vco="unknown"
   ;;
esac

case $cmd in
 qhdir)
   cmd=vdir
   ;;
 qhmap)
   cmd=vmap
   ;;
 qvlcom)
   cmd=vlog
   ;;
 qhcvt)
   cmd=../convert.tcl
   ;;
 qhlib)
   cmd=vlib
   ;;
 qhsim)
   cmd=vsim
   ;;
 qhdel)
   cmd=vdel
   ;;
 qhmake)
   cmd=vmake
   ;;
 qvhcom)
   cmd=vcom
   ;;
 qhgencomp)
   cmd=vgencomp
   ;;
 vco)
   echo $vco
   exit
   ;;
esac

# verify that we can find the command to execute.
if [ -x $dir/$vco/$cmd ] ; then
 arg0=$dir/$vco/$cmd
else
 # if bin nolonger has symbolic links in it then
 # we need to look up and over
 f2=$dir/$vco/$cmd
 if [ -x $f2 ] ; then
   arg0=$f2
 elif [ -x $dir/${vco}pe/$cmd ] ; then
   arg0=$dir/${vco}pe/$cmd
 elif [ -x $dir/${vco}le/$cmd ] ; then
   arg0=$dir/${vco}le/$cmd
 else
   # Last ditch effort.  Use original arg0 and try it!
   d2=`dirname $0`
   f2=$d2/$vco/$cmd
   if [ -x $f2 ] ; then
     arg0=$f2
   else
     echo "Error: cannot find $dir/$vco/$cmd"
     exit 1
   fi
 fi
fi

if [ -z "$*" ] ; then
 exec $arg0
else
 exec $arg0 "$@"
fi

 

το script ανάλογα την πλατφόρμα καλει το σωστό vsim, πχ στην περίπτωση μου,

>if [ "$mode" != "64" ] \
         && [ -x $dir/linux_gcc3/vsim ] 

 

Στο google το μόνο που κατάφερα να βρω είναι κάποιον που το έκανε σε CentOS με επιτυχία με το ίδιο script του launcher που δίνω παραπάνω. Παρεμπιπτόντως είμαι σε Ubuntu 12.04 LTS 64bit. Μου έχει σπάσει τα νεύρα αν και ξέρω ότι δεν έχει σημασία, σπάζομαι και έχω λυσσάξει που δεν δουλεύει!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Από κονσόλα φυσικά τρέχει κανονικά.

 

Δοκίμασε να βγάλεις τελείως το sh -c αφού πρώτα έχεις κάνει το script (πιθανόν να είναι ήδη) executable.

 

Και τελικά να γίνει έτσι:

>
Exec=/opt/modelsim-6.5/modeltech/bin/vsim

 

Π.χ. στο netbeans που έχει επίσης ένα script έχω κάνει αυτό ακριβώς, έχω βγάλει το sh που είχε και δηλώνω στο Exec του .desktop κατευθείαν το script.

 

Αυτό το έκανα όχι γιατί είχα κάποιο πρόβλημα με την εκτέλεση του script αλλα γιατι οπως ήταν πριν δεν μπορούσα να περάσω κάτι παραμέτρους στο script σχετικα με το loook and feel.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δοκίμασε να βγάλεις τελείως το sh -c αφού πρώτα έχεις κάνει το script (πιθανόν να είναι ήδη) executable.

 

Και τελικά να γίνει έτσι:

>
Exec=/opt/modelsim-6.5/modeltech/bin/vsim

 

Το script είναι exec, το έχω προσπαθήσει και χωρίς sh -c...νιεντε!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Όταν τρέχει κανονικά απο κονσόλα, τι γράφεις σε αυτή;

>vsim &

 

φτιάξε ένα σκριπτάκι test.sh στο home σου, που να περιέχει μόνο:

>
cd /opt/modelsim-6.5/modeltech/bin/;./vsim

 

κάντο εκτελέσιμο, και βάλε τη διαδρομή του στο Exec

ΟΚ, το θέμα αποκτάει ενδιαφέρον, λοιπόν, έφτιαξα το σκριπτάκι και πάλι τα ίδια. Την ώρα που κλίνει το shell παρατήρησα ότι κάτι τυπώνει, οπότε το άλλαξα λίγο:

 

>
#!/bin/sh
#
#run_vsim.sh

cd /opt/modelsim-6.5/modeltech/bin/
echo 'Launching vsim...'
echo
./vsim
sleep 5

και παραπονιέται για το License για κάποιο λόγο, δηλαδή:

 

Launching vsim...

 

Unable to find the license file. It appears that your license file environment variable (e.g., LM_LICENSE_FILE) is not set correctly.

Unable to checkout a license. Vsim is closing.

** Fatal: Invalid license environment. Application closing.

το οποίο είναι περίεργο διότι το δηλώνω μέσα στο .bashrc μου, έτσι:

 

>
# Modelsim
##########
export PATH=/opt/modelsim-6.5/modeltech/bin:${PATH}
export LM_LICENSE_FILE=/home/delk/flexlm/license.dat
export MGLS_LICENSE_FILE=${LM_LICENSE_FILE}

άρα όταν εκτελείται ο launcher και στη συνέχεια το test.sh για κάποιο λόγο στο session του terminal που ανοίγει δεν γίνεται source το .bashrc οπότε δεν ορίζονται τα path variables!

 

Δοκίμασα λοιπόν τον παρακάτω μπακαλίστικο τρόπο, να δηλώσω πριν την εκτέλεση του vsim μέσα στο run_vsim.sh τα variables ως εξής:

 

>
#!/bin/sh
#
#run_vsim.sh
# Modelsim
##########
export PATH=/opt/modelsim-6.5/modeltech/bin:${PATH}
export LM_LICENSE_FILE=/home/delk/flexlm/license.dat
export MGLS_LICENSE_FILE=${LM_LICENSE_FILE}
cd /opt/modelsim-6.5/modeltech/bin/

echo 'Launching vsim...'
echo
./vsim

....και ναι δούλεψε επιτέλους!!! :-D

 

Το θέμα είναι γιατί δεν γίνεται source το .bashrc εξαρχής εφόσον σηκώνεται shell πριν τρέξει το vsim; Γενικά η πατέντα μου είναι σωστή, παίρνει κάποια βελτίωση;

 

UPDATE!

 

To variable PATH μέσα στο script δεν περνάει για κάποιο λόγο, δηλαδή αν κάνω comment out το #cd /opt/modelsim-6.5/modeltech/bin/ δεν βρίσκει το ./vsim, οπότε το άλλαξα σε:

 

>#!/bin/sh
#
#run_vsim.sh

# Modelsim
##########
export LM_LICENSE_FILE=/home/delk/flexlm/license.dat
export MGLS_LICENSE_FILE=${LM_LICENSE_FILE}

cd /opt/modelsim-6.5/modeltech/bin/
echo 'Launching vsim...'
echo
./vsim

 

Περίεργο μου φαίνεται! :shifty:

Επεξ/σία από Dr.Fuzzy
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Κανένας;

 

Για δοκήμασε(αν και δεν νομίζω...):

>
setsid sh -c '/opt/modelsim-6.5/modeltech/bin/vsim'&

 

Υ.Γ. Δεν είχα δεί το

 

export PATH=/opt/modelsim-6.5/modeltech/bin:${PATH}

export LM_LICENSE_FILE=/home/delk/flexlm/license.dat

export MGLS_LICENSE_FILE=${LM_LICENSE_FILE}

 

Λογικα δεν εχει προλαβει να φορτοσει το .bashrc

 

Για δοκήμασε:

>
setsid echo sleep 10\;sh -c \'/opt/modelsim-6.5/modeltech/bin/vsim\'\& |  sh

 

 

Κοινός run in new session ενα sh στο οποίο αφού περάσουν 10 sec θα τρέξει sh -c '/opt/modelsim-6.5/modeltech/bin/vsim'

 

Υ.Γ.2: έχει λουκούμι τριαντάφυλλο??

Υ.Γ.3: Σε αυτό που έγραψα πώς πάει η προτερεότιτα??

Πώς ορίζεις στο bash προτερεότιτα??

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Καλή προσπάθεια...αλλά δυστυχώς όχι! Ιδού:

 

>echo sleep 5\;sh -c \'/opt/modelsim-6.5/modeltech/bin/vsim\'\& |  sh;sleep 5

 

>Unable to find the license file.  It appears that your license file environment variable (e.g., LM_LICENSE_FILE) is not set correctly.
Unable to checkout a license.  Vsim is closing.
** Fatal: Invalid license environment. Application closing.

 

Βρες το και όσα λουκούμια θες! :mrgreen:

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν ξερω τι παιζει...

Για κάποιο λόγο δεν φορτώνει το .bashrc

τρέχτο έτσι:

>
Exec=/bin/bash -c  '. ~/.bashrc; /opt/modelsim-6.5/modeltech/bin/vsim'

 

 

http://www.rekk.de/bloggy/2009/gnome-application-launcher-run-application-in-certain-directory/

 

Περίεργο bug πάντος....

 

http://stackoverflow.com/questions/4477328/bashrc-not-read-when-shell-script-is-invoked-from-desktop-shortcut

When bash is invoked as an interactive login shell, or as a non-interactive shell with the --login option, it first reads and executes commands from the file /etc/profile, if that file exists. After reading that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, in that order, and reads and executes commands from the first one that exists and is readable. The --noprofile option may be used when the shell is started to inhibit this behavior.

 

When a login shell exits, bash reads and executes commands from the file ~/.bash_logout, if it exists.

 

When an interactive shell that is not a login shell is started, bash reads and executes commands from ~/.bashrc, if that file exists. This may be inhibited by using the --norc option. The --rcfile file option will force bash to read and execute commands from file instead of ~/.bashrc.

 

Long story short, if you want non-interactive shell's to have certain ENV vars set, then put them in ~/.bash_profile instead of ~/.bashrc

 

πλάκα πλάκα δοκίμαστο μια και έτσι...

>
Exec=sh --login -c '/opt/modelsim-6.5/modeltech/bin/vsim'

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Φιλε Dr. Fuzzy

 

Αν και δεν ειμαι ειδημωνας στο σκριπτινγκ...αυτο που πιστευω εγω οτι φταιει που δεν γινεται source to .bashrc ειναι το "#!/bin/sh" στην αρχη του σκριπτ

 

για δοκιμασε το

#!/bin/bash -i

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

@semaphor, @mphxths μπράβο και στους δύο! :-D Κερδίσατε από ένα πακέτο λουκούμια! :mrgreen: Λοιπόν έχουμε και λέμε...

 

@semaphor

 

όντως πρέπει να είναι bug, μπράβο που το ξετρύπωσες, οπότε έβαλα τα env variables στο .bash_profile και μέσα στο launcher τον πρώτο τρόπο (source το .bash_profile και μετά vsim) και ναι δουλεύει! :confused:

 

@mphxths

 

έχεις δίκιο, δεν το είχα σκεφτεί (που να ήσουν και ειδήμων δηλαδή!), το άλλαξα και γίνεται source κανονικά το .bashrc και δουλεύει. Παρόλα αυτά θα προτιμήσω τον τρόπο του semaphor διότι έτσι γλυτώνω το ενδιάμεσο run_vsim.sh που καλεί ο launcher.

 

Μια τελευταία ερώτηση, αν δεν σας έχω πρήξει είδη! Υπάρχει τρόπος αφού σηκωθεί το modelsim να 1. αποδεσμεύεται και 2. να κλείνει το terminal ή έστω να γίνεται minimized αυτόματα; Για το πρώτο σκεφτόμουν κάτι σαν $ctrl-z και μετά bg για το δεύτερο μάλλον δύσκολο το βλέπω.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μια τελευταία ερώτηση, αν δεν σας έχω πρήξει είδη! Υπάρχει τρόπος αφού σηκωθεί το modelsim να 1. αποδεσμεύεται και 2. να κλείνει το terminal ή έστω να γίνεται minimized αυτόματα; Για το πρώτο σκεφτόμουν κάτι σαν $ctrl-z και μετά bg για το δεύτερο μάλλον δύσκολο το βλέπω.

 

 

1. αποδεσμεύεται:

Μπορείς να ξεκινήσεις μια εφαρμογή με:

>
setsid vsim &
nohup vsim &
ή vsim & disown

 

και για μια που τρέχει...

>
ctrl-z
$bg
$disown %1

2. να κλείνει το terminal

>
exit

Για δοκίμασε..

>
Exec=/bin/bash -c  '. ~/.bashrc; setsid /opt/modelsim-6.5/modeltech/bin/vsim & ; exit'

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...