Executar comando na inicialização / login (Mac OS X)

53

Eu queria saber em qual arquivo devo colocar esse comando bash para que ele seja executado na inicialização.

# Start the MongoDB server
/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log

I foram vasculhando a net e acho que é entre ~/.bashrc, ~/profile, /etc/bashrc, /etc/profileou ~/.bash_profile. Embora eu tenha tentado isso e eles parecem funcionar na inicialização do terminal, não na inicialização do Mac . Estou faltando um arquivo?

Wolfy87
fonte

Respostas:

33

Oficialmente, nenhum deles. A maneira sugerida pela Apple é usar o launchd . Guis para configurar isso incluem lingon e Launch Control

Quanto aos arquivos mencionados no diretório inicial ~ / .bashrc, ~ / profile, ~ / .bash_profile são iniciados somente quando você faz login através de um terminal. Os do / etc são executados pelo shell, iniciando para todos os usuários antes dos do diretório inicial, mas somente quando o login do usuário é feito. Bash manual

O script de inicialização do Unix envolvia / etc / rc *, mas para o OSX apenas use o material launchd

user151019
fonte
11
Então, se meu comando estiver inserido em um dos arquivos, /etcele deverá ser executado na inicialização? Importa em que está?
precisa saber é o seguinte
11
/etc/bashrce assim por diante são executados quando você inicia um shell, da mesma forma ~/.bashrc- é que o primeiro será executado sempre que qualquer usuário iniciar um shell, e não apenas o seu usuário.
Scott
@Scott está correto Corrigi minha resposta
user151019
4
Ok, mas eu simplesmente não consigo descobrir como usar o launchd, tentei criar um arquivo plist para o meu programa, mas não tenho idéia de como executá-lo ou como executá-lo na inicialização.
precisa saber é o seguinte
11
O link do @Mark para "launchd" está quebrado :(
Artem 07/11
58

Para executar um comando na inicialização do OS X, você precisa usar launchd.

Se você não quiser usar o Lingon , precisará criar uma launchdLista de propriedades. Este é um arquivo XML, para que você possa fazer isso com o seu editor de texto favorito ou, como alternativa, pode usar o Editor de Lista de Propriedades instalado com as Ferramentas de Desenvolvimento do Mac OS X. Crie o seguinte:

<?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>some.meaningful.name</string> <!-- org.mongodb.mongodb perhaps? -->

    <key>OnDemand</key>
    <false/>

    <key>UserName</key>
    <string>anAppropriateUser</string>

    <key>GroupName</key>
    <string>anAppropriateGroup</string>

    <key>ProgramArguments</key>
    <array>
            <string>/Applications/MongoDB/bin/mongod</string>
            <string>--dbpath</string>
            <string>/usr/local/mongo/data</string>
            <string>--fork</string>
            <string>--logpath</string>
            <string>/usr/local/mongo/log</string>
    </array>
</dict>
</plist>

Salve isso em /Library/LaunchAgents/some.meaningful.name.plist(você precisará de uma conta de administrador e / ou sudo), abra um terminal e faça:

sudo launchctl load /Library/LaunchAgents/some.meaningful.name.plist

Isso fará com que o launchd carregue o item, o que fará com que o MongoDB inicie na inicialização. Como bônus, ele launchdserá monitorado e, se sair por algum motivo, será reiniciado. Para se livrar do item, basta substituir a carga no comando acima por descarregar.

Scott
fonte
11
Esta página ( developer.apple.com/library/mac/documentation/Darwin/Reference/… ) lista muitas coisas que algo iniciado pelo launchd não deve fazer. Se eu quiser executar um comando arbitrário na inicialização, talvez eu não tenha controle e o comando pode acabar fazendo essas coisas. Além disso, talvez eu não queira que o launchd seja reiniciado e que o item seja interrompido porque é único ou lida sozinho com o relançamento. O que devo fazer nesses casos?
Michael
@ Scott, obrigado. Esta é a resposta mais útil que encontrei na internet.
Dmitriy
5
Isso tentará executar o aplicativo a cada 10 segundos, o que funciona bem para serviços que não morrem. Se for para um script executado uma vez pontualmente (no meu caso, enviar uma mensagem quando o Slack for reiniciado) será adicionado <key>LaunchOnlyOnce</key><true/>ao comando.
precisa saber é
Ótimo ponto, Sr. Sanford. O launchd, que não desiste, cria enormes arquivos de log que diminuem a velocidade do seu Mac (devido à leitura e gravação desses grandes arquivos de log continuamente). Eu posso usar essa correção em alguns dos softwares comerciais mal escritos em execução no meu computador agora.
Foliovision 22/10
11
Nota para si mesmo: se você precisar de variáveis ​​de ambiente: serverfault.com/questions/111391/…
Quandary 23/03
48

Outra solução simples do Stack Overflow : Você pode:

  • Inicie o Automator.app;
  • Selecione "Aplicativo";
  • Clique em "Mostrar biblioteca" na barra de ferramentas (se oculta);
  • Adicione "Executar script de shell" (em Ações / Utilitários);
  • Copie e cole seu script na janela;
  • Teste-o;
  • Salve-o em algum lugar: um arquivo chamado your_name.appserá criado);
  • Dependendo da sua versão do MacOSX:
    • Velhas versões: Vá para Preferências do Sistema → itens Contas → Login, ou
    • Nova versão: Vá para Preferências do sistema → Usuários e grupos → Itens de login (canto superior direito);
  • Adicione este aplicativo recém-criado;

Faça logoff, faça login novamente, e você deve terminar. ;)

Jaime M.
fonte
2
Testado e funciona, e não requer edição complicada nem lançamento de aplicativo Lingon pago.
Lukasz
4
No entanto, adiciona cerca de 1804k de clichê ao seu shellscript de três linhas!
android.weasel
11
Obrigado pelas instruções detalhadas sobre como tornar algo útil com o Automator. Isso me ajudará não apenas com a única tarefa. Obrigado, gentilmente, Jaime. Estou usando-o para desativar o Turbo Boost via Turbo Boost Switcher. Eu possuo a versão paga, mas a mecânica de licenciamento é péssima o bastante. Prefiro usar a versão gratuita, que requer o lançamento via terminal, para evitar solicitações de senha de administrador a cada despertar.
Foliovision 22/10
11
@ android.weasel Veja a resposta do Geekarist superuser.com/a/995564/255375
JD
Superuse-ful :-D, +1
Mukul Goel
28

Para iniciar comandos ao efetuar login, você pode fazer o seguinte:

  • Crie um arquivo de texto contendo seus comandos (script bash):

    #!/bin/bash
    
    # Start the MongoDB server
    /Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork --logpath /usr/local/mongo/log
    
  • Salve este arquivo em ~/Library/Startup.cmd

  • Você pode testá-lo clicando duas vezes no arquivo no Finder
  • Torne executável: chmod +x ~/Library/Startup.cmd
  • Adicione este arquivo em Preferências do sistema> Contas> Itens de login
Geekarist
fonte
3
melhor e mais fácil resposta imho. solução muito mais fácil do que aceita. observe que está em Preferências do sistema> Usuários e grupos> Itens de logon ... (não Contas) ... e também observe que o arquivo pode estar em qualquer lugar, também não precisa terminar com .cmd. apenas chmod + x.
foreyez 8/08/16
5
No entanto, os itens de logon são executados no logon, não na inicialização do sistema. Se você executa um servidor, é uma grande diferença.
not2savvy
Você está certo @ not2savvy. Para um servidor, eu recomendaria a resposta de @ Sridhar-Sarnobat com @reboot. No entanto, minha resposta permitiria iniciar um programa gráfico, por isso acho útil.
Geekarist
Por que termina com em cmdvez de sh?
Simin Jie
3

Você terá que ver como launchde launchctltrabalhar no MacOS. Você pode começar lendo as páginas de manual dos dois comandos. Você pode procurar dentro /Library/LaunchAgents/e /Library/LaunchDaemons/exemplos de como configurar aplicativos para carregar em momentos diferentes através da launchctlinterface.

Aqui está um exemplo que encontrei no Stack Overflow que pode ajudá-lo ainda mais.

ayaz
fonte
0

Eu estava interessado em uma resposta unix muito simples para esse problema e a encontrei em outro site . Aqui está um resumo da solução.

O padrão para shells de login é sempre procurar os arquivos de configuração do bash com "profile" no nome, nesta ordem: / etc / profile, ~ / .bash_profile, depois ~ / .bash_login e, por fim, ~ / .profile. Quando os shells de login saem, eles lêem ~ / .bash_logout.

No meu caso, acabei de criar o ~ / .bash_profile e, em seguida, abri as preferências do aplicativo Mac Terminal e alterei a opção "Shell abre com" do padrão para / bin / bash. É isso aí. Limpo e simples.

markgp
fonte
-3

terminal aberto, tipo

nano ~/.bash_profile

adicione este texto ao arquivo:

/Applications/MongoDB/bin/mongod --dbpath /usr/local/mongo/data --fork logpath /usr/local/mongo/log
MAX
fonte
3
Isso seria supor que você abrir uma janela Terminal após o login.
Arjan