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

Έλεγχος αν το script τρέχει σε (ορατή) κονσόλα;


alkisg

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

Φτιάχνουμε ένα σκριπτάκι να κάνει κάτι.

Το τρέχουμε από κονσόλα κι αν κάτι δεν πάει καλά μας ειδοποιεί με echo.

Του κάνουμε συντόμευση στην επιφάνεια εργασίας και το τρέχουμε, οπότε δε φαίνεται κονσόλα και το echo πάει περίπατο.

 

Μπορεί όμως να χρησιμοποιηθεί η xmessage αντί για την echo, οπότε να ειδοποιείται πάλι ο χρήστης.

 

...και το πρόβλημα είναι, πώς το script μπορεί να κάνει detect αν "το βλέπει" ή όχι ο χρήστης, ώστε να χρησιμοποιήσει echo ή xmessage αντίστοιχα;

 

Κάποια μεταβλητή περιβάλλοντος φαντάζομαι. Σύγκρινα λοιπόν τα environment variables στις δύο περιπτώσεις και βρήκα αρκετές διαφορές, αλλά δεν ξέρω ποια να διαλέξω.

Π.χ. TERM=dumb είναι καλή επιλογή;

 

>
alkisg@alkisgL:/tmp$ diff set-interactive.txt set-noninteractive.txt 
3a4
> BASH_EXECUTION_STRING='set > /tmp/set.txt'
8,9d8
< COLORTERM=gnome-terminal
< COLUMNS=157
12d10
< DESKTOP_STARTUP_ID=
24,27d21
< HISTCONTROL=ignoreboth
< HISTFILE=/home/alkisg/.bash_history
< HISTFILESIZE=500
< HISTSIZE=500
33,35d26
< LESSCLOSE='/usr/bin/lesspipe %s %s'
< LESSOPEN='| /usr/bin/lesspipe %s'
< LINES=39
37d27
< LS_COLORS='no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.svgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:'
39d28
< MAILCHECK=60
44,48c33
< PIPESTATUS=([0]="0")
< PPID=3901
< PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME}: ${PWD/$HOME/~}\007"'
< PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
< PS2='> '
---
> PPID=1
50c35
< PWD=/home/alkisg/bin
---
> PWD=/home/alkisg
53c38
< SHELLOPTS=braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
---
> SHELLOPTS=braceexpand:hashall:interactive-comments
57c42
< TERM=xterm
---
> TERM=dumb
62d46
< WINDOWID=75501216
68,77c52
< _=/tmp/set.txt
< command_not_found_handle () 
< { 
<     if [ -x /usr/lib/command-not-found ]; then
<         /usr/bin/python /usr/lib/command-not-found -- $1;
<         return $?;
<     else
<         return 127;
<     fi
< }
---
> _=/bin/bash

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

Φτιάχνουμε ένα σκριπτάκι να κάνει κάτι.

Το τρέχουμε από κονσόλα κι αν κάτι δεν πάει καλά μας ειδοποιεί με echo.

Του κάνουμε συντόμευση στην επιφάνεια εργασίας και το τρέχουμε, οπότε δε φαίνεται κονσόλα και το echo πάει περίπατο.

 

Μπορεί όμως να χρησιμοποιηθεί η xmessage αντί για την echo, οπότε να ειδοποιείται πάλι ο χρήστης.

 

Αν πας μια βόλτα στο /proc/<pid>/fd/ θα δεις τους file descriptors του αντίστοιχου process. Όταν το process «φαίνεται» κάπου (σε κονσόλα, σε terminal emulator ή στο screen), τότε ο file descriptor 1 (== stdout) θα είναι symbolic link σε κάποιο tty ή pts (pseudo-terminal) device.

 

Επειδή το να το κοιτάξεις με το χέρι έχει κάποια δουλίτσα, υπάρχει η tty(1), η οποία επιστρέφει το terminal που βλέπει στη standard input (το οποίο στο 99% των περιπτώσεων που σε απασχολούν είναι το ίδιο με το terminal στη standard output για ένα απλό script) ή "not a tty" σε περίπτωση που αυτό τρέχει στο background. Μπορείς λοιπόν να χρησιμοποιήσεις την tty για έναν απλό σχετικά έλεγχο.

 

Σε άλλες γλώσσες βέβαια τα πράγματα είναι πιο απλά, στην python για παράδειγμα μπορείς να ρωτήσεις απευθείας

>
sys.stdout.isatty()

σε shell έχει λίγη παραπάνω δουλειά.

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

Γκαρσόν! Μία

 

monitoring_beer_bubbles.jpg

 

από μένα στον κύριο! :-D

 

(Υ.Γ., στα αναθεματισμένα ελληνικά μου βγάζει δεν είναι tty' - μαζί με την απόστροφο στο τέλος!!! :shock: ΟΚ, κοιτάω το exit code...)

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

Που θα πάει, δε θα ανέβω Γιάννενα; :D

 

Πάντως αν ανέβεις κανόνισε να κάτσεις 2-3 μέρες για να προλάβεις να ξεμεθύσεις! (...μετά από τόσες μπύρες που χρωστάω...) :D :D :D

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

Χε... τα views μετράνε ανά άτομο, όχι ανά page hit. Και ο αποστολέας του μηνύματος δε μετράει. Επομένως 1 = apoikos.

Τουλάχιστον το smf που έχω εγώ έτσι κάνει...

 

edit: το αποτέλεσμα:

>
#!/bin/bash

# If running without a console, use graphical commands.
if (tty -s); then
ECHO=echo
SUDO=sudo
else
ECHO="xmessage -center -timeout 5"
SUDO=gksudo
fi

$SUDO ifconfig eth0:1 192.168.0.1/24 up
$SUDO /etc/init.d/dhcp3-server restart
$ECHO "Done!"

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

Μπα, τα κλασσικά (ltsp κτλ), απλά στο ραφινάρισμα είμαι τώρα, π.χ. ήθελα να "μετατρέπω" το laptop σε ltsp server με διπλό κλικ από το desktop αντί από κονσόλα...

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

Να ρωτήσω κι εγώ κάτι παρόμοιο αλλά σχεδόν άσχετο;

Είμαι σε kde και τρέχω κάτι στο konsole, για παράδειγμα ένα apt-get uprade. Θέλω όμως να αλλάξω Desktop Environment ή να επανεκκινήσω τον Xserver, χωρίς να σταματήσει η διαδικασία του apt-get. Μπορώ φυσικά να τη στείλω στο background (με ctrl-z, bg). Κλείνω το konsole, κάνω επανεκκίνηση τον Χ. Μπορώ να επαναφέρω το output του apt-get στο νέο konsole που θα ανοίξω;

 

alkisg μόλις είδα πως ένας άλλος τρόπος για να κάνεις αυτό που θες είναι να κάνεις ένα

>
$ ps ax | grep script_name | grep -v grep | awk '{print $2}'

και να ελέγχεις αν αυτό που επιστρέφει είναι ? ή κάποιο pts...

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

Μπορώ φυσικά να τη στείλω στο background (με ctrl-z, bg). Κλείνω το konsole, κάνω επανεκκίνηση τον Χ.

Δε μπορείς να το κάνεις αυτό. Με το που την στέλνεις στο background κατα κανόνα παγώνει την εκτέλεσή της ενώ αν κλείσεις και την Konsole τερματίζει.

 

Μπορώ να επαναφέρω το output του apt-get στο νέο konsole που θα ανοίξω;

Θα πρέπει να χρησιμοποιήσεις έναν terminal manager σαν τη screen. Κορυφαία εφαρμογή, περιορίζει την ανάγκη για πολλά terminal tabs ή ssh sessions!

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

Δε μπορείς να το κάνεις αυτό. Με το που την στέλνεις στο background κατα κανόνα η εφαρμογεί παγώνει την εκτέλεσή της ενώ αν κλείσεις και την Konsole τερματίζει.

Παγώνει μέχρι να εκτελέσω το bg και να πάει στο background. Είναι σαν να εκτέλεσα

>
# script_name &

 

Θα πρέπει να χρησιμοποιήσεις έναν terminal manager σαν τη Screen

Αα, ναι υπάρχει το screen. Το είχα διαβάσει στο slackbook αλλά δεν το χρησιμοποίησα ποτέ και ξέχασα οτι υπάρχει. Πάντως πρέπει να έχω προνοήσει και να έχω τρέξει το screen πριν κάνω αυτό που θέλω.

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

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...