[Script] Besoin d'aide pour terminer un script (Résolu)

Autres projets et contributions
Avatar de l’utilisateur
Xorg
Maître du Kyudo
Messages : 1933
Inscription : dim. 22 janv. 2012, 19:25
Localisation : Entre le clavier et la chaise.

[Script] Besoin d'aide pour terminer un script (Résolu)

Message par Xorg »

Salutations. :)

J'étais en train de faire le tour de mes scripts X, et je désire les peaufiner un peu, mais après plusieurs essais, je ne parviens pas au résultat attendu. :?
En fait, le principe est simple : j'apprécie l'idée d'ouvrir ce qu'on veut dans un serveur graphique, et donc parfois je préfère ouvrir un programme seul dans un serveur X, plutôt que de devoir lancer le bureau et tout ce qui va avec. Donc mes scripts sont très petits et ne font rien d'extraordinaire, mais c'est toujours bon à prendre.

Pour l'instant, j'ai fait ceci est ça fonctionne parfaitement :

Code : Tout sélectionner

#!/bin/bash

tty=$(tty | cut -c 9-10) 
Xorg :$tty vt$tty -ac -terminate &
DISPLAY=:$tty mon_programme
reset
archey3
Donc le programme utilise le bon Bourne Again Shell, puis récupère le nombre qui correspond à la console active, ouvre un serveur X à la place de la console actuelle, puis lance mon_programme. Une fois mon_programme fermé, X se ferme, la console est réinitialisé (sans cela j'ai eu quelques surprises), puis bon après le Archey3 ce n'est que de la poudre aux yeux.

Le problème est quand il y a plusieurs processus d'ouvert, là il m'est impossible de terminer correctement le script, je dois quitter Xorg à la barbare (Ctrl+Alt+Backspace) :

Code : Tout sélectionner

#!/bin/bash

tty=$(tty | cut -c 9-10) 
Xorg :$tty vt$tty -ac -terminate &
DISPLAY=:$tty openbox &
DISPLAY=:$tty xscreensaver &
DISPLAY=:$tty mon_programme
reset
archey3
Dans ce cas là, j'ouvre OpenBox (car dans mon cas, si j'essaie d'ouvrir Firefox sans, la fenêtre n'est pas dans une dimension qui me plait, car l'application n'est pas fenêtrée en réalité), XScreenSaver parce que je le vaux bien, et puis mon_programme se lance.
Mais là, dès qu'on ferme mon_programme, le serveur graphique continue de tourner. :?

Le problème, c'est que je ne peux pas utiliser killall, car c'est trop simple et ça risque de terminer plusieurs PID qui se cachent derrière un seul nom de processus, alors que je cherche qu'à en fermer un.

Je ne sais pas qu'est-ce que je suis censé écrire, pour que dès que je ferme mon_programme, le serveur X se ferme et que le script se termine. Un test ? Ou plus compliquer, arriver à récupérer les bons PID ? Ou peut-être que c'est juste ma structure qui ne va pas ?

Merci d'avance.
Dernière modification par Xorg le dim. 17 févr. 2013, 12:30, modifié 1 fois.
Arch Linux x86_64 - Sway
AMD Ryzen 5 3600X - 32 Go de DDR4 - SSD NVMe 1 To + SSD SATA 250 Go - Sapphire NITRO+ Radeon RX 580
Image AUR___Image Wiki___Image GitHub
Avatar de l’utilisateur
Ypnose
Maître du Kyudo
Messages : 1363
Inscription : sam. 01 mai 2010, 13:17

Re: [Script] Besoin d'aide pour terminer un script

Message par Ypnose »

Tu peux récupérer le pid avec pgrep ton_processus.
Tu pourrais faire quelque chose du genre avec un script qui contient un argument

Code : Tout sélectionner

#!/bin/bash
PROG=$(pgrep $1)
while [[ -n $PROG ]]
   do
       echo "Vive Arch"
       ce que tu dois faire
   done
echo "X has been terminated"
Quand tu fermeras ton programme, X se fermera (j'ai testé avec geany) :)
Tu devras lancer ton script avec un argument (ici le nom du programme que tu veux lancer). Si tu l'appelles tinyx, tu devras faire par exemple ./tinyx geany
Cependant, ne te trompes pas dans les majuscules/minuscules, sinon ça ne marche plus.
Avatar de l’utilisateur
benjarobin
Maître du Kyudo
Messages : 17186
Inscription : sam. 30 mai 2009, 15:48
Localisation : Lyon

Re: [Script] Besoin d'aide pour terminer un script

Message par benjarobin »

Pour l'attente de plusieurs programme je te conseil ceci :

Code : Tout sélectionner

export DISPLAY=:$tty

prog1 & &>/dev/null
pid_prog1=$!

prog2 & &>/dev/null
pid_prog2=$!

wait $pid_prog1
wait $pid_prog2

exit
Zsh | KDE | PC fixe : core i7, carte nvidia
Titre d'un sujet : [Thème] Sujet (état) / Règles du forum
Avatar de l’utilisateur
Xorg
Maître du Kyudo
Messages : 1933
Inscription : dim. 22 janv. 2012, 19:25
Localisation : Entre le clavier et la chaise.

Re: [Script] Besoin d'aide pour terminer un script

Message par Xorg »

Benjarobin, je ne cherche pas à attendre plusieurs programmes, je cherche juste à mettre fin au script dès qu'un seul des programmes ouverts par ce script se ferme.
Par exemple, bash exécute A et B en même temps, mais quand je ferme B, je veux que ça ferme aussi A. :)

Ypnose, j'ai essayé ton script, merci bien, mais ça n'a pas fonctionné comme je le voulais. Ça rouvre le serveur X à chaque fois que je le ferme. :roll:
Arch Linux x86_64 - Sway
AMD Ryzen 5 3600X - 32 Go de DDR4 - SSD NVMe 1 To + SSD SATA 250 Go - Sapphire NITRO+ Radeon RX 580
Image AUR___Image Wiki___Image GitHub
Avatar de l’utilisateur
tuxce
Maître du Kyudo
Messages : 6677
Inscription : mer. 12 sept. 2007, 16:03

Re: [Script] Besoin d'aide pour terminer un script

Message par tuxce »

Tu peux utiliser kill -0 pour vérifier si un processus tourne toujours, exemple :

Code : Tout sélectionner

p=()
sleep 30&
p_main=$!
sleep 10&
p+=($!)
sleep 20&
p+=($!)
while kill -0 ${p[@]} &> /dev/null; do
  sleep .5
done
kill $p_main
Ceci dit, je te conseille plutôt d'utiliser startx pour ce que tu fais. Au lieu de lancer le script, tu lances :

Code : Tout sélectionner

startx le_script
Avec le script qui contient :

Code : Tout sélectionner

openbox &
xscreensaver &
mon_programme
Sinon, pour la détection du tty, tu peux utiliser $XDG_VTNR
Avatar de l’utilisateur
Xorg
Maître du Kyudo
Messages : 1933
Inscription : dim. 22 janv. 2012, 19:25
Localisation : Entre le clavier et la chaise.

Re: [Script] Besoin d'aide pour terminer un script

Message par Xorg »

Mais oui, bien sûr, le startx ! Pourquoi n'y avais-je pas pensé ? Moi qui utilise Compiz en standalone et qui a beaucoup joué avec la possibilité qu'offrent le .xinitrc. :oops:

Effectivement, j'ai testé ta méthode du startx, et elle fait bien ce que je cherchais à faire, elle simplifie un peu plus mes scripts du coup. Je suis désolé de vous avoir fait écrire des bouts des scripts inutilement, si j'avais su qu'il y avait une méthode simple... Je crois que je vous ai orienté sur trop compliqué...
J'ai fait ceci (oui, je suis tellement fainéant, je préfère écrire du scripts supplémentaires pour avoir des commandes à taper plus courtes) :

Code : Tout sélectionner

#!/bin/bash

export PROG=firefox
startx $HOME/X_global
reset
archey3
Et le fameux X_global :

Code : Tout sélectionner

openbox &
xscreensaver &
$PROG
Comme ça, j'ai juste à taper ff pour lancer Firefox. Et ça me convient bien, je n'ai pas envie d'utiliser un allias pour ça. :wink:

Merci pour la variable $XDG_VTNR, je me sens bête du coup pour l'utilisation du tty=$(tty | cut -c 9-10).

Merci beaucoup pour votre coup de main, vos réponses sont toujours de qualité. Bonne journée. :D
Arch Linux x86_64 - Sway
AMD Ryzen 5 3600X - 32 Go de DDR4 - SSD NVMe 1 To + SSD SATA 250 Go - Sapphire NITRO+ Radeon RX 580
Image AUR___Image Wiki___Image GitHub
Répondre