Executando script no login mac [fechado]


280

Gostaria de saber se alguém pode me ajudar a obter um arquivo .sh para executar quando eu fizer login na minha conta no meu computador. Estou executando o Mac OS X 10.6.7.

Eu tenho um arquivo "Example.sh" que desejo executar quando fizer logon no meu computador. Não tenho problemas ao executá-lo quando já estou logado, mas quero que ele seja executado automaticamente.

As pessoas estão dizendo para adicioná-lo ao arquivo de shell de logon, mas não sei onde é. Alguma ajuda por favor.


3
Isso não é fora de tópico ... Eu precisava dele para iniciar meu daemon Emacs;) Aliás, a melhor resposta é IMHO, o aplicativo Lingon X.
24418 HappyFace

1
Eu não me importo se isso estiver fora de tópico. É a melhor resposta que encontrei na internet e merece respeito. Eu o ignorei para os outros na minha primeira vez procurando uma solução e isso foi um grande erro!
Sethmr 31/05/19

Respostas:


378

Siga isso:

  • começar Automator.app
  • selecionar Application
  • clique Show libraryna barra de ferramentas (se oculta)
  • adicionar Run shell script(do Actions/Utilities)
  • copie e cole seu script na janela
  • teste-o
  • salve em algum lugar (por exemplo, você pode criar uma Applicationspasta em sua HOME, receberá uma your_name.app)

  • vá para System Preferences-> Accounts->Login items

  • adicione este aplicativo
  • teste e feito;)

EDITAR:

Recentemente, recebi o selo "Boa resposta" por esta resposta. Embora minha solução seja simples e funcional, a maneira mais limpa de executar qualquer programa ou script de shell no momento do login é descrita na resposta da @ trisweb , menos que você queira interatividade .

Com a solução de automação, você pode fazer o seguinte: aplicativo de login de captura de tela do automator

portanto, pedindo para executar um script ou sair do aplicativo, solicitando senhas, executando outros fluxos de trabalho de automação no momento do login, execute condicionalmente aplicativos no momento do login e assim por diante ...


2
@GregMiernicki LOL, bom dia ...;) Há quase um ano, adicionei uma EDIT à minha resposta, e também contei isso. Porém, isso é um pouco mais simples para usuários comuns, porque a criação de arquivos XML (plist) não é muito amigável para muitos usuários. Enfim - thanx por um comentário. ;)
jm666

4
@GregMiernicki e não se esqueça, com a solução Automator, você pode criar scripts de login INTERATIVOS - por exemplo, um script que solicitará alguma entrada (por exemplo, senha adicional ou algo parecido). O mundo não é só preto ou branco - pelo menos, é como uma zebra ... :) :)
jm666

2
@Cupidvogel Executar um daemon no momento do login é exatamente o trabalho da solução launchd - veja a resposta da trisweb. Se você pode gerenciar um daemon python, você está certo pode gerenciar um arquivo de configuração plist onde você pode gerenciar todos os aspectos de reiniciar e assim por diante ...
jm666

3
Parabéns por apontar a outra resposta como a mais limpa. Isso deve ter um bom emblema de cidadania :).
studgeek

2
Resposta incrível. Exporte PATH = / usr / local / bin: $ PATH, no início do script, se desejar executar comandos como "atualização global do compositor" na inicialização do sistema.
Leonardo

377

dr: use o iniciador e gerenciador de processos nativo do OSX launchd,.

Para fazer isso, faça um launchctldaemon. Você terá controle total sobre todos os aspectos do script. Você pode executar uma vez ou manter-se vivo como um daemon. Na maioria dos casos, este é o caminho a percorrer.

  1. Crie um .plistarquivo de acordo com as instruções nos documentos do Apple Dev aqui ou com mais detalhes abaixo.
  2. Colocar em ~/Library/LaunchAgents
  3. Faça login (ou execute manualmente via launchctl load [filename.plist])

Para mais informações launchd, o artigo da Wikipedia é bastante bom e descreve o sistema e suas vantagens sobre outros sistemas mais antigos.


Aqui está o arquivo plist específico para executar um script no login .

Atualizado 25/09/2017 para OSX El Capitan e mais recente (crédito para José Messias Jr ):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
   <key>Label</key>
   <string>com.user.loginscript</string>
   <key>ProgramArguments</key>
   <array><string>/path/to/executable/script.sh</string></array>
   <key>RunAtLoad</key>
   <true/>
</dict>
</plist>

Substitua a <string>chave depois do programa pelo comando desejado (observe que qualquer script referenciado por esse comando deve ser executável: chmod a+x /path/to/executable/script.shpara garantir que seja para todos os usuários).

Salvar como ~/Library/LaunchAgents/com.user.loginscript.plist

Execute launchctl load ~/Library/LaunchAgents/com.user.loginscript.pliste efetue logout / logon para testar (ou testar diretamente, executar launchctl start com.user.loginscript)

Cauda /var/log/system.logpara mensagens de erro.

A chave é que essa é uma entrada launchd específica do usuário, portanto ela será executada no login do usuário especificado. Daemons de inicialização específicos do sistema (colocados em /Library/LaunchDaemons) são executados na inicialização.

Se você deseja que um script seja executado no login para todos os usuários, acredito que o LoginHook é sua única opção, e provavelmente é por isso que existe.


4
Sim. FWIW Encontrei este blog com a mesma técnica útil: developernotes.com/archive/2011/04/06/169.aspx
Daniel James

8
Você não menciona o que é dúbio sobre as ações do Automator e por que elas não são recomendadas.
Mike Campbell

4
Aqui está uma boa visão geral sobre ações de pasta versus launchctl: apple.stackexchange.com/a/63731/38290 - E outra sobre uma das limitações do LoginHook (apenas um script permitido) - superuser.com/a/377401 . Na verdade, não é um método duvidoso ou ruim, mas launchctlé simplesmente muito melhor na maioria dos casos e oferece mais controle sobre todos os aspectos possíveis da execução do script. É mais no sentido de "por que usar um método menos capaz quando o launchd existe?" (Observe que alterei a primeira frase para indicar que eu pessoalmente não as recomendo para esta situação).
trisweb

3
Pensando em como você criará o LaunchDaemon, o que será executado sempre que o usuário fizer login? . Portanto, não quando o sistema inicializar, mas sempre que o usuário efetuar login (tente com o ciclo de logout-login). Você pode mostrar exatamente (não apenas bla-bla) como implementar a solução de automação acima (por você errada) com o launchctl?
cajwine

9
Os arquivos plist em / Library / LaunchAgents / são executados no login com o ID do usuário conectado. Os arquivos do plist em / Library / LaunchDaemons / são executados no momento da inicialização como root (o ID pode ser alterado com a chave do usuário ).
bain

42
  1. Crie seu script de shell como login.shna sua pasta $ HOME.

  2. Cole o seguinte script de uma linha no Editor de scripts:

    do shell script "$ HOME / login.sh"

  3. Em seguida, salve-o como um aplicativo.

  4. Por fim, adicione o aplicativo aos seus itens de login.

Se você deseja tornar visual o resultado do script, é possível trocar a etapa 2 por isso:

tell application "Terminal"
  activate
  do script "$HOME/login.sh"
end tell

Se vários comandos forem necessários, algo como isto pode ser usado:

tell application "Terminal"
  activate
  do script "cd $HOME"
  do script "./login.sh" in window 1
end tell

1
Liguei este, a única coisa que falta um instalador de linha de comando;)
Sorin

1
Ótima solução. Como ocultar a janela "login"? Tentei marcar itens de login.
xgdgsc

1
@xgdgsc: Vá para Go to System Preferences -> Accounts -> Login itemse marque a caixa de ocultar para este aplicativo.
Anubhava

1
@anubhava Como eu disse, já marquei a caixa de ocultar para este aplicativo de login. Mas ainda aparece e precisa ser forçado a sair ao desligar o computador.
Xgdgsc

2
@xgdgsc: Oh ok, você checou a ~/Library/LaunchAgentspasta?
Anubhava
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.