web-dev-qa-db-fra.com

Comment puis-je exécuter une application dans gnome-terminal automatiquement lors du démarrage?

Je dois exécuter une application automatiquement au démarrage d’Ubuntu. J'ai cette application en cours d'exécution sans ouvrir le terminal. Cependant, cette application affiche des informations dans une fenêtre de terminal et, par conséquent, j'ai besoin que l'application s'exécute strictement après l'ouverture de gnome-terminal (automatiquement). À cette fin, j'ai essayé de créer un fichier de script dans init.d comme il est expliqué ici . Le contenu du script est:

#!/bin/bash
cd /home/mediambient/programa 
/usr/bin/gnome-terminal -e ./driver &

Cela fonctionne si j'exécute le fichier, mais ne semble rien faire lorsque je redémarre l'ordinateur. Quelqu'un peut-il me dire ce que je fais mal?

Merci d'avance.

5
koco

Vous ne pouvez pas créer un script qui s'exécute à partir de init.d et qui affiche une fenêtre gnome-terminal, car les scripts de init.d sont exécutés avant qu'une session de connexion ne soit affichée. Ils s'exécutent avant même que l'interface utilisateur graphique ne soit exécutée.

Se connecter à un fichier à la place

Si vous devez exécuter ce script au démarrage de la machine, vous devez lui faire écrire son résultat au lieu d’en faire un texte automatiquement. Pour qu’il exécute à la fois une sortie normale et une sortie d’erreur dans un fichier journal, créez le script comme suit:

#!/bin/bash
cd /home/mediambient/programa
./driver &>> logfile

Remplacez logfile par le nom du fichier journal que vous souhaitez utiliser. Vous pouvez avoir ce fichier dans le dossier /home/mediambient/programa ou le placer dans le dossier des fichiers journaux du système (/var/log). C'est ton choix. Veuillez noter que l'opérateur &>> ajoutera la sortie à la fin du fichier journal. Si vous souhaitez que le fichier journal soit écrasé à chaque fois, utilisez plutôt l'opérateur &>.

Exécution de commandes à partir d'un script d'initialisation en tant qu'utilisateur non -root

Veuillez également noter que les scripts de init.d seront exécutés sous la forme root. Si vous ne le souhaitez pas, mais souhaitez exécuter programa en tant qu'utilisateur mediambient, vous pouvez écrire le script comme suit:

#!/bin/bash
cd /home/mediambient/programa
Sudo -u mediambient ./driver &>> logfile

Ceci exécute le programme en tant que mediambient mais enregistre quand même le fichier journal sous le nom root. Si vous souhaitez également enregistrer le fichier journal sous le nom mediambient (ce que vous devriez probablement faire si vous le placez dans le dossier personnel de mediambient), vous pouvez utiliser:

#!/bin/bash
cd /home/mediambient/programa
Sudo -u mediambient ./driver 2>&1 | Sudo -u mediambient tee logfile > /dev/null

(Si cela vous intéresse de savoir exactement comment cela fonctionne, cela explique 2>&1 et cela explique tee .)

(En passant, veuillez noter que rien dans ce script n'exige spécifiquement bash, qui est un excellent shell interactif mais qui nécessite un peu de ressources à utiliser pour les scripts d'initialisation et d'arrière-plan. Pendant longtemps, le shell par défaut pour l'exécution de tels scripts dans Ubuntu dash, ce qui est beaucoup plus léger. Si vous utilisez #!/bin/sh au lieu de #!/bin/bash, utilisez le shell préféré du système d’exploitation pour exécuter des scripts de style POSIX. , mais c’est une bonne habitude à prendre.)

Exécution du script lorsqu'un utilisateur se connecte graphiquement au lieu de démarrer

Sinon, si vous avez vraiment besoin que le script soit exécuté lorsque l'utilisateur mediambient se connecte graphiquement (plutôt que lorsque l'ordinateur démarre), vous pouvez le faire exécuter driver dans une fenêtre gnome-terminal. Vous ne pouvez pas utiliser init.d pour cela; au lieu de cela, vous devez utiliser la fonctionnalité fournie par votre environnement de bureau.

Si vous utilisez une Ubuntu basée sur GNOME (avec Unity, Unity 2D, GNOME Classic/Fallback ou GNOME Shell comme environnement de bureau) - ce que je suppose que vous êtes, puisque vous voulez afficher le résultat dans un fichier gnome-terminal-- alors vous pouvez le faire en appuyant sur Alt+ F2 et en cours d'exécution gnome-session-properties. Cela vous donne la possibilité de modifier vos applications de démarrage. Placez ce qui suit dans le champ Command::

gnome-terminal --working-directory=/home/mediambient/programa -e ./driver

Exécution du script au démarrage, connexion à un fichier et affichage automatique du journal lorsqu'un utilisateur se connecte graphiquement

Ou vous pouvez (en quelque sorte) obtenir le meilleur des deux mondes en plaçant le script dans init.d à exécuter lorsque Ubuntu démarre pour la première fois, puis en créant automatiquement une fenêtre gnome-terminal montrant le résultat au fur et à mesure, mediambient se connecte graphiquement. Pour ce faire, ajoutez une entrée aux applications de démarrage avec cette commande:

gnome-terminal --working-directory=/home/mediambient/programa -x tail -n 512 -f logfile

(Ou si logfile est un chemin absolu plutôt que relatif vers le fichier journal, vous pouvez omettre --working-directory=/home/mediambient/programa.)

-n 512 signifie qu'il affiche jusqu'à 512 lignes du fichier journal avant de commencer à afficher le fichier journal. (Elle affichera ensuite chaque ligne au fur et à mesure de son ajout au fichier journal.) Il s’agit généralement d’un choix judicieux puisqu’une fenêtre gnome-terminal ne mémorise que 512 lignes par défaut. Si vous exécutez gnome-terminal avec un profil modifié mémorisant plus de 512 lignes, vous pouvez modifier la commande tail en conséquence.

Limiter la taille du fichier journal

Si vous êtes préoccupé par la taille croissante du fichier journal, la première chose à faire est de déterminer si cela risque de poser problème. Vous pourriez juste être en mesure d'estimer. Supposons que le fichier journal augmente d'une ligne par seconde (ce qui est beaucoup plus rapide que la plupart des fichiers journaux) et que chaque ligne compte 80 caractères. Alors dans un mois, le fichier a une taille de 200 Mo . En un an, il atteint environ 2,5 Go. Quelques centaines de mégaoctets vont probablement bien et plusieurs gigaoctets ne le sont probablement pas. La question est de savoir si vous pourrez éditer manuellement le fichier journal pour l'effacer. dehors, au moins tous les quelques mois?

S'il se rapproche d'une ligne par minute, le fichier croît à un taux inférieur à 50 Mo par an , auquel cas vous n'avez probablement jamais à vous soucier de vider le fichier.

Il existe deux moyens simples pour effacer le fichier. Vous pouvez le modifier et en supprimer une partie (ou la totalité). Ou vous pouvez le supprimer et le laisser être créé à nouveau. Si vous le supprimez, il continuera à occuper de l’espace sur le disque jusqu’à ce que plus rien ne l’accède, ce qui signifie que vous devrez peut-être redémarrer driver. Vous devez également redémarrer tail, mais vous pouvez résoudre ce problème en utilisant une commande tail modifiée qui ne garde pas le fichier ouvert:

gnome-terminal --working-directory=/home/mediambient/programa -x tail -n 512 --follow=name logfile

(J'ai remplacé -f par --follow=name.)

Pour une gestion plus avancée ou automatique des fichiers journaux en croissance, vous pouvez utiliser la commande logrotate . La commande logrotate vérifie si les fichiers journaux ont dépassé leur taille ou leur âge maximal, et les "fait pivoter", les compressant dans des archives numérotées (qui sont elles-mêmes éventuellement supprimées) et créant un nouveau fichier journal. logrotate vous enverra même un courrier électronique à propos des journaux, si vous le configurez pour le faire. La logrotate page de manuel explique comment écrire des fichiers de configuration pour indiquer à logrotate les journaux à utiliser.

Vous pouvez exécuter logrotate automatiquement à partir de la crontab utilisateur de mediambient. (Une crontab répertorie les tâches effectuées périodiquement par le démon cron .) La commande crontab installe et fonctionne sur les crontabs utilisateur. Vous pouvez également ajouter une entrée dans la table des tâches système, /etc/crontab (ce qui serait un choix raisonnable si vous exécutez le script dans init.d et que vous l'exécutez sous driver sous la forme root plutôt que sous la forme mediambient. Veuillez noter que les journaux système d'Ubuntu sont tournés avec logrotate, bien que dans la configuration par défaut actuelle d'Ubuntu, ils ne soient pas appelés directement depuis n'importe quelle crontab. .

Cet aperçu de la rotation des journaux avec logrotate et de la planification des tâches avec cron devrait vous aider à démarrer, mais n'hésitez pas à poser des questions plus détaillées sur AskUbuntu sur ces sujets ou, si vous préférez, à commenter ici ou à modifier votre question pour fournir plus de détails vous voulez faire (alors je pourrais peut-être donner des explications plus détaillées sur la façon de le faire).

8
Eliah Kagan

Vous avez ceci écrit:

/usr/bin/gnome-terminal -e ./driver &

Le paramètre & qui se trouve à la fin de la ligne signifie que le programme va être masqué. Ceci est utile pour exécuter des applications en arrière-plan telles que des serveurs Web contenant des sons de démarrage, mais dans votre cas, vous ne devriez pas l'utiliser. La solution est aussi simple que de l'enlever:

/usr/bin/gnome-terminal -e ./driver

Et j'ai vu que vous n'utilisiez pas GNOME pour le démarrage automatique. Utilisez ces instructions au lieu de celles de Server (remplacez google-chrome par la commande ci-dessus!): Démarrage automatique de Chrome sous ubunt

0
Xerz