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

Έλεγχος αν το 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!

Δημοσ.

Screen και τα μυαλά στα κάγκελα :) Από τα αναντικατάστατα κομμάτια software. Αν θες απλά να κάνεις detach/reattach μια διεργασία, υπάρχει και το dtach.

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

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

>
# script_name &

 

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

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

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

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

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