2017-04-09 2 views
0

J'ai écrit un script shell qui exécute un programme python. Ensuite, je veux charger un fichier dans le programme en utilisant xdotool. En ce moment c'est mon code:Je cours un programme dans un script shell. Comment savoir si elle a été chargée? (Linux)

#!/bin/bash 
cd ~/Folder 
python program.py & 
sleep 10 
WID=$(xdotool search --onlyvisible program) 
.... 

Je n'aime vraiment pas ma solution d'attendre juste 10 secondes pour que le programme soit chargé. Y a-t-il un meilleur moyen?

+0

Votre programme Python lance-t-il la seconde partie du script? – kindall

+0

Je n'ai pas écrit le programme python. C'est un logiciel open source – MilloMille

+0

'xdotool search' a une option' --sync' qui attendra que la fenêtre devienne visible. Si vous l'exécutez avec cette option (c'est-à-dire 'xdotool search --sync --onlyvisible program'), votre script n'a pas besoin de' sleep' du tout. – ottomeister

Répondre

0

Cela dépend vraiment. Si program.py est supposé finir alors passez à xdotool alors vous pouvez utiliser && au lieu de &. Un seul & signifie que vous voulez que la commande s'exécute, puis passez à la commande suivante dès que possible sans attendre qu'elle se termine. Un dobule && signifie que vous voulez attendre que l'exécution soit terminée, puis continuez uniquement si vous avez une erreur zéro. Vous pouvez également simplement supprimer le & ou utiliser ; si vous souhaitez exécuter la commande suivante, quel que soit le succès de program.py. Voici ce que je veux en venir:

#!/bin/bash 
cd ~/Folder 
python program.py && 
WID=$(xdotool search --onlyvisible program) 
... 

Si program.py est censé continuer à fonctionner pendant que vous exécutez la commande xdotool, mais vous avez besoin program.py d'arriver à un état prêt avant de continuer, alors vous avez raison dans l'utilisation & , mais vous devez surveiller le program.py d'une manière ou d'une autre, et obtenir un signal de ce que c'est ok pour continuer. Une façon ancienne de le faire est de simplement laisser program.py créer/toucher/éditer un fichier, et quand ce fichier est détecté, continuez. Un moyen plus avancé serait d'utiliser des sockets réseau ou similaires, mais je vous déconseille si vous n'avez vraiment pas besoin de faire quelque chose de fantaisie. Quoi qu'il en soit, si vous faites program.py créer un fichier de signaux, dire /tmp/.program_signalfile, quand les choses sont prêts tout ce que vous avez à faire est:

#!/bin/bash 
cd ~/Folder 
python program.py & 
until [ -f /tmp/.program_signal_file ] 
do 
    sleep 1 
done 
WID=$(xdotool search --onlyvisible program) 
rm /tmp/.program_signal_file 
... 

Dans cette dernière solution program.py et xdotool sont tous deux en cours d'exécution en même temps. Si c'est ce que tu cherchais.

+0

Merci ce que vous avez dit était vraiment utile. J'ai besoin que le programme s'exécute pendant que j'exécute la commande xdotool. Mais comment puis-je faire le programme créer un fichier? C'est un logiciel open source que je n'ai pas écrit. – MilloMille

+0

Dans le code source, il y a une ligne appelée app.MainLoop() Dois-je créer le fichier juste avant cela? Mais comment puis-je créer un fichier? Désolé je suis encore assez nouveau à cette – MilloMille