Come posso eseguire uno script su login / logout di Unity?


8

Ho due script - uno per montare alcune cartelle su SSHFS - e uno da smontare.

Vorrei lanciare lo script di mount all'avvio del desktop Ubuntu predefinito (dopo aver effettuato l'accesso dalla console grafica) e lo script di smontaggio quando "Esci ..." dalla ruota dentata in alto a destra di il desktop.

Per favore qualcuno può dirmi come raggiungere questo obiettivo? Quali sono gli hook più convenienti / standard per eseguire comandi all'avvio / uscita del desktop?


Non mi aspetto che i tempi siano critici. Ciò che conta è che il primo script venga eseguito entro circa un secondo ... prima che l'utente avvii le applicazioni in modo interattivo. Al logout, importa solo che il secondo script venga eseguito prima che qualcun altro acceda alla console.
cena il

Ho accesso root. L'installazione dei pacchetti non è un problema. Se possibile, mi piacerebbe usare solo i privilegi a livello di utente - supponendo che ci sia un modo pulito per farlo. I miei script non hanno bisogno di root. Sto cercando consigli su come avviare al meglio i miei script su Unity start / stop ... La maggior parte della mia esperienza Linux / Unix è in un contesto non GUI. Con XWindows della vecchia scuola e un gestore di finestre alla vaniglia, avrei potuto farlo da .xinitrc. Qual è il modo migliore con il desktop Unity moderno e predefinito?
cena il

Non voglio fare dipendere l'azione di disconnessione da ciò che è / non è montato ... Tutto questo è gestito in modo dinamico dagli script esistenti. Quello di cui ho bisogno è un modo semplice per eseguire il primo script all'accesso e il secondo al log-off per la sessione della GUI sulla console. Ho trovato "Applicazioni di avvio", ma ciò risolverebbe solo la prima metà del problema.
aSteve

Non credo che le "applicazioni di accesso" siano la strategia giusta per nessuno dei due script. Ho due script ... uno imposta le cose per la mia sessione di GUI; l'altro pulisce dopo una sessione della GUI. Entrambi dovrebbero essere eseguiti come lo stesso utente della sessione della GUI. Né richiede alcun argomento. Devo trovare un modo appropriato per avviare gli script: al momento giusto, tutto qui. Non dovrebbero essere necessari presupposti su ciò che effettivamente fanno gli script. Questa domanda riguarda tutto come agganciare gli eventi in coincidenza con l'accesso e la disconnessione di Unity.
cena il

Risposte:


9

Considerando la necessità di eseguire un processo quando si accede a Unity e non per altri accessi, un processo di sessione Upstart sembra perfetto.

Potresti averlo notato: i processi eseguiti dopo un accesso alla GUI sono sottoposti a un secondo initprocesso. Questo initè un vero Upstart init e puoi avviare e interrompere i lavori di sessione in base agli eventi emessi da esso. Non sono necessari privilegi di root. Meglio ancora (o peggio a seconda della prospettiva), questo non è ancora completamente supportato per i sistemi senza testa. Un accesso SSH non ha avviato l'utente init da un test rapido che ho effettuato proprio ora.

Per creare un processo di sessione, creare un nuovo .conffile ~/.config/upstart. Questa è la directory principale predefinita per i lavori della sessione Upstart ( $XDG_CONFIG_HOME/upstart), crearla se non esiste. Ecco un lavoro di esempio:

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

Puoi controllarlo manualmente:

start myjob 
# or
initctl start myjob

I servicecomandi vengono utilizzati per controllare i lavori di sistema (quelli in /etc/init.do /etc/init). Per controllare i lavori di sessione, è necessario utilizzare il initctlcomando, che viene utilizzato per interagire con Upstart.

Vedi man upstart-eventsper altri eventi che puoi usare.


Non avevo notato ... ma ... sono d'accordo - un lavoro di sessione iniziale sembra perfetto. Probabilmente mi manca qualcosa di ovvio ... ma dopo aver creato ~ / .config / upstart / myjob.conf (come sopra) quando eseguo "service myjob start" Ottengo "myjob: servizio non riconosciuto" Qualche idea?
cena il

Risolto: avevo bisogno di usare "start myjob" invece di "service myjob start". Un altro comando utile era "lista initctl"
ateve

@aSteve dispiace per quello. L'ho corretto,
muru

Nessun problema. L'approccio upstart / sessioni sembra decisamente giusto. Detto questo, non ho ancora identificato il modo migliore per usarlo per eseguire script di avvio e arresto separati (di breve durata). Posso usare solo 1 file .conf o ho bisogno di 2? Dovrebbe essere un "servizio" o un "compito"? Dovrei usare pre / post start e pre / post stop? Non ho bisogno / voglio che avvenga un processo tra start e stop ... a meno che, immagino, non ci sia un modo semplice per mettere un'icona nella barra degli strumenti ... anche se, probabilmente, è eccessivo - per i miei scopi.
notte

1
Finalmente. Dopo molti hacking ... ho scoperto che ho bisogno che myendtask venga attivato "a fine sessione", non "a fine desktop". Questo è in qualche modo contro-intuitivo, ma funziona. (Finalmente!)
notte

1

La soluzione era utilizzare le attività di avvio. Ho richiesto due attività: una attivata quando il desktop viene inizializzato per un utente; il secondo alla scadenza della sessione degli utenti. I seguenti due script funzionano per me con Ubuntu 14.04.

In ~ / .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

In ~ / .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

Incrociamo le dita sul fatto che questi eventi continueranno a soddisfare i requisiti nelle future versioni di Ubuntu. Ho pensato che valesse la pena pubblicare qui la mia soluzione, nel caso sia utile ad altri.


-1

Ecco alcuni suggerimenti per eseguire uno script dopo il login:

StackOverflow Script Linux dopo l'avvio : Cliff notes deve mettere il tuo file * .sh in /etc/profile.d.

Se si desidera eseguire script all'avvio, ecco alcuni suggerimenti per questo:

StackOverflow Script Linux dopo l'avvio : Cliff notes deve usare /etc/rc.local o crontab.


1
Nessuna di queste opzioni sembra "giusta". Voglio eseguire lo script solo quando eseguo l'accesso / disconnessione nel senso di iniziare / terminare una sessione di unità. Non voglio eseguire i miei script ogni volta che c'è un nuovo accesso. I nuovi accessi possono essere avviati in remoto tramite ssh ecc., Ma non voglio che eseguano lo script in quanto non avviano una nuova sessione Unity (su console).
notte
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.