Como executo um script no logon / logout do Unity?

8

Eu tenho dois scripts - um para montar algumas pastas no SSHFS - e outro para desmontar.

Eu gostaria de iniciar o script de montagem quando minha área de trabalho Ubuntu padrão for iniciada (depois de fazer login no console gráfico) - e o script de desmontagem quando eu "Sair ..." da roda dentada no canto superior direito de a área de trabalho.

Por favor, alguém pode me dizer como conseguir isso? Quais são os ganchos mais convenientes / padrão para executar comandos na inicialização / saída da área de trabalho?

aSteve
fonte
Não espero que o momento seja crítico. O que importa é que o primeiro script seja executado em mais ou menos um segundo ... antes que o usuário inicie aplicativos interativamente. No logout, importa apenas que o segundo script seja executado antes que alguém faça o login no console.
aSteve
Eu tenho acesso root. Instalar pacotes não é problema. Se possível, eu gostaria de usar apenas privilégios no nível do usuário - supondo que haja uma maneira legal de fazer isso. Meus scripts não precisam de raiz. Estou procurando conselhos sobre a melhor maneira de iniciar meus scripts no Unity start / stop ... A maior parte da minha experiência com Linux / Unix está em um contexto que não é da GUI. Com o XWindows da velha escola e um gerenciador de janelas de baunilha, eu poderia ter feito isso no .xinitrc. Qual é a melhor maneira com a área de trabalho moderna e padrão do Unity?
aSteve
Não quero tornar a ação de logoff dependente do que está / não está montado ... Tudo isso é tratado dinamicamente pelos scripts existentes. O que eu preciso é de uma maneira elegante de executar o primeiro script no logon e o segundo no logoff da sessão da GUI no console. Encontrei "Aplicativos de inicialização" - mas isso resolveria apenas a primeira metade do problema.
aSteve
Não acho que "aplicativos de login" seja a estratégia certa para nenhum dos scripts. Eu tenho dois scripts ... um define as coisas para a minha sessão da GUI; o outro limpa após uma sessão da GUI. Ambos devem ser executados como o mesmo usuário da sessão da GUI. Nenhum dos dois requer argumentos. Preciso encontrar uma maneira apropriada de iniciar os scripts - na hora certa, é tudo. Nenhuma suposição sobre o que os scripts realmente fazem deve ser necessária. Esta questão é sobre como conectar eventos coincidentes com o logon e logoff do Unity.
aSteve

Respostas:

9

Considerando o seu requisito de executar um trabalho quando você faz login no Unity e não em outros logons, um trabalho de sessão Upstart parece perfeito.

Você deve ter notado: os processos executados após o login na GUI estão sob um segundo initprocesso. Esse inité um init Upstart adequado e você pode iniciar e interromper trabalhos de sessão com base nos eventos emitidos por ele. Não são necessários privilégios de root. Melhor ainda (ou pior, dependendo da perspectiva), isso ainda não é completamente suportado por sistemas sem cabeça. Um login SSH não iniciou o init do usuário a partir de um teste rápido que eu fiz agora.

Para criar um trabalho de sessão, crie um novo .confarquivo ~/.config/upstart. Esse é o diretório principal padrão dos trabalhos de sessão Upstart ( $XDG_CONFIG_HOME/upstart), crie-o se não existir. Aqui está um exemplo de trabalho:

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

Você pode controlá-lo manualmente:

start myjob 
# or
initctl start myjob

O servicecomando é usado para controlar os trabalhos do sistema (aqueles em /etc/init.dou /etc/init). Para controlar trabalhos de sessão, é necessário usar o initctlcomando, usado para interagir com o Upstart.

Veja man upstart-eventspara mais eventos que você pode usar.

muru
fonte
Eu não tinha notado ... mas ... eu concordo - um trabalho de sessão inicial parece perfeito. Provavelmente estou perdendo algo óbvio ... mas depois de criar o ~ / .config / upstart / myjob.conf (como acima) quando executo "service myjob start", recebo "myjob: service não reconhecido" Alguma idéia?
aSteve
Resolvido: eu precisava usar "start myjob" em vez de "service myjob start". Outro comando útil foi "initctl list"
aSteve 31/08
@Steve desculpe por isso. Eu o corrigi,
muru
Sem problemas. A abordagem inicial / sessões definitivamente parece certa. Dito isto, ainda não identifiquei a melhor maneira de usá-lo para executar scripts de início e parada separados (de curta duração). Posso usar apenas 1 arquivo .conf ou preciso de 2? Deveria ser um "serviço" ou uma "tarefa"? Devo usar o início pré / pós e a parada pré / pós? Eu não preciso / quero que um processo seja executado entre iniciar e parar ... a menos que, creio, haja uma maneira fácil de colocar um ícone na barra de ferramentas ... embora isso seja provavelmente um exagero - para meus propósitos.
aSteve
1
Finalmente. Após muita invasão ... Descobri que preciso que o myendtask fosse acionado "no final da sessão", não "no final da área de trabalho". Isso é contra-intuitivo, mas funciona. (Finalmente!)
aSteve
1

A solução foi usar tarefas iniciais. Eu exigi duas tarefas - uma disparada quando a área de trabalho é inicializada para um usuário; o segundo quando a sessão do usuário expirar. Os dois scripts a seguir funcionam para mim no Ubuntu 14.04.

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

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

Estou irritado com o fato de que esses eventos continuarão a atender aos requisitos em versões futuras do Ubuntu. Eu pensei que vale a pena postar minha solução aqui - caso seja útil para outras pessoas.

aSteve
fonte
-1

Aqui estão algumas sugestões para executar um script após o login:

Script Linux do StackOverflow após a inicialização : o Cliff notes é para colocar seu arquivo * .sh em /etc/profile.d.

Se você deseja executar scripts na inicialização, aqui estão algumas sugestões:

Script Linux do StackOverflow após a inicialização : as notas do Cliff devem usar /etc/rc.local ou crontab.

Higgs
fonte
1
Nenhuma dessas opções parece "certa". Eu só quero executar o script quando fizer logon / off no sentido de iniciar / encerrar uma sessão de unidade. Não quero executar meus scripts sempre que houver um novo logon. Novos logons podem ser iniciados remotamente pelo ssh etc - mas não quero que eles executem o script, pois não iniciam uma nova sessão do Unity (no console).
aSteve 29/08