Comment exécuter un script lors de la connexion / déconnexion Unity?

8

J'ai deux scripts - un pour monter certains dossiers sur SSHFS - et un pour démonter.

Je voudrais lancer le script de montage lorsque mon bureau Ubuntu par défaut est lancé (après ma connexion à la console graphique) - et le script de démontage lorsque je me "déconnecte ..." de la roue dentée en haut à droite de le bureau.

S'il vous plaît, quelqu'un peut-il me dire comment y parvenir? Quels sont les crochets les plus pratiques / standard pour exécuter des commandes au lancement / à la sortie du bureau?

aSteve
la source
Je ne m'attends pas à ce que le moment soit critique. Ce qui importe, c'est que le premier script soit exécuté dans une seconde environ ... avant que l'utilisateur ne lance les applications de manière interactive. Lors de la déconnexion, il importe simplement que le deuxième script soit exécuté avant que quelqu'un d'autre ne se connecte sur la console.
aSteve
J'ai un accès root. L'installation de packages ne pose aucun problème. Si possible, j'aimerais utiliser uniquement des privilèges de niveau utilisateur - en supposant qu'il existe une façon soignée de le faire. Mes scripts n'ont pas besoin de root. Je cherche des conseils sur la meilleure façon de lancer mes scripts sur Unity start / stop ... La plupart de mon expérience Linux / Unix est dans un contexte non-GUI. Avec la vieille école XWindows et un gestionnaire de fenêtres vanille, j'aurais pu le faire à partir de .xinitrc. Quelle est la meilleure façon d'utiliser le bureau Unity moderne et par défaut?
aSteve
Je ne veux pas faire dépendre l'action de déconnexion de ce qui est / n'est pas monté ... Tout cela est géré dynamiquement par les scripts existants. Ce dont j'ai besoin, c'est d'un bon moyen d'exécuter le premier script à la connexion et le second à la déconnexion pour la session GUI sur la console. J'ai trouvé des "applications de démarrage" - mais cela ne résoudrait que la première moitié du problème.
aSteve
Je ne pense pas que les "applications de connexion" soient la bonne stratégie pour l'un ou l'autre des scripts. J'ai deux scripts ... l'un configure les choses pour ma session GUI; l'autre nettoie après une session GUI. Les deux doivent être exécutés en tant que même utilisateur que la session GUI. Ni l'un ni l'autre n'exige d'argument. Je dois trouver un moyen approprié de lancer les scripts - au bon moment, c'est tout. Aucune hypothèse sur ce que font réellement les scripts ne devrait être nécessaire. Cette question concerne la connexion des événements coïncidant avec la connexion et la déconnexion Unity.
aSteve

Réponses:

9

Compte tenu de votre besoin d'exécuter un travail lorsque vous vous connectez à Unity et non pour d'autres connexions, un travail de session Upstart semble parfait.

Vous l'avez peut-être remarqué: les processus que vous exécutez après une connexion à l'interface graphique sont sous un deuxième initprocessus. Il inits'agit d'une bonne initiation Upstart, et vous pouvez démarrer et arrêter des travaux de session en fonction des événements émis par celle-ci. Aucun privilège root nécessaire. Mieux encore (ou pire selon la perspective), ce n'est pas encore complètement pris en charge pour les systèmes sans tête. Une connexion SSH n'a pas démarré l'initialisation de l'utilisateur à partir d'un test rapide que je viens de faire.

Pour créer un travail de session, créez un nouveau .conffichier dans ~/.config/upstart. Il s'agit du répertoire principal par défaut pour les travaux de session Upstart ( $XDG_CONFIG_HOME/upstart), créez-le s'il n'existe pas. Voici un exemple de travail:

tee ~/.config/upstart/myjob.conf <<EOF
description "My job"
start on desktop-start
stop on desktop-end

script 
       firefox 'http://upstart.ubuntu.com/cookbook/#session-job'
end script
EOF

Vous pouvez le contrôler manuellement:

start myjob 
# or
initctl start myjob

Les servicecommandes sont utilisées pour contrôler les tâches système (celles de /etc/init.dou /etc/init). Pour contrôler les travaux de session, il faut utiliser la initctlcommande, qui est utilisée pour interagir avec Upstart.

Voir man upstart-eventspour plus d'événements que vous pouvez utiliser.

muru
la source
Je ne l'avais pas remarqué ... mais ... je suis d'accord - un travail de débutant semble parfait. Il me manque probablement quelque chose d'évident ... mais après avoir créé ~ / .config / upstart / myjob.conf (comme ci-dessus) lorsque j'exécute "service myjob start" j'obtiens "myjob: service non reconnu" Des idées?
aSteve
Résolu: je devais utiliser "start myjob" au lieu de "service myjob start". Une autre commande utile était "liste initctl"
aSteve
@aSteve désolé. Je l'ai corrigé,
muru
Aucun problème. L'approche upstart / sessions semble définitivement la bonne. Cela dit, je n'ai pas encore identifié la meilleure façon de l'utiliser pour exécuter des scripts de démarrage et d'arrêt séparés (de courte durée). Puis-je utiliser seulement 1 fichier .conf ou en ai-je besoin de 2? Doit-il s'agir d'un "service" ou d'une "tâche"? Dois-je utiliser le pré / post-démarrage et le pré / post-arrêt? Je n'ai pas besoin / je veux qu'un processus s'exécute entre le démarrage et l'arrêt ... à moins, je suppose, qu'il existe un moyen facile de mettre une icône dans la barre d'outils ... bien que cela soit probablement exagéré - pour mes besoins.
aSteve
1
Finalement. Après beaucoup de piratage ... J'ai découvert que j'avais besoin que la myendtask soit lancée "à la fin de la session", pas "à la fin du bureau". C'est quelque peu contre-intuitif, mais cela fonctionne. (Enfin!)
aSteve
1

La solution était d'utiliser des tâches parvenues. J'ai exigé deux tâches - une déclenchée lorsque le bureau s'initialise pour un utilisateur; le second lorsque la session des utilisateurs expire. Les deux scripts suivants fonctionnent pour moi sous Ubuntu 14.04.

Dans ~ / .config / upstart / desktopOpen.conf

description "Desktop Open Task"
start on desktop-start
task
script
# Commands to mount sshfs go here as shell-script.
end script

Dans ~ / .config / upstart / desktopClose.conf

description "Desktop Close Task"
start on session-end
task
script
# Commands to unmount sshfs go here as shell-script.
end script

Je croise les doigts pour que ces événements continuent de répondre aux exigences des futures versions d'Ubuntu. J'ai pensé qu'il valait la peine de publier ma solution ici - au cas où elle serait utile à d'autres.

aSteve
la source
-1

Voici quelques suggestions pour exécuter un script après la connexion:

Script StackOverflow Linux après le démarrage : Cliff notes consiste à placer votre fichier * .sh dans /etc/profile.d.

Si vous souhaitez exécuter des scripts au démarrage, voici quelques suggestions:

Script StackOverflow Linux après le démarrage : Cliff notes doit utiliser /etc/rc.local ou crontab.

Higgs
la source
1
Aucune de ces options ne semble «correcte». Je veux uniquement exécuter le script lorsque je me connecte / me déconnecte dans le sens de démarrer / terminer une session d'unité. Je ne veux pas exécuter mes scripts à chaque nouvelle connexion. De nouvelles connexions peuvent être lancées à distance via ssh, etc. - mais je ne veux pas qu'elles exécutent le script car elles n'initient pas de nouvelle session Unity (sur console).
2014