Como posso executar / parar / reiniciar um aplicativo automaticamente, durante a inicialização / login / outra hora?

42

Como você cria um script ou aplicativo para executar ou parar a execução automaticamente quando o sistema é inicializado, quando um usuário faz logon, em um horário específico, quando um disco é anexado, etc.?

prosseek
fonte
3
O Lingon é apenas um aplicativo para facilitar a criação dos arquivos .plist para o launchd. Também alguém fez um criador de plist launchd baseado na web: plist.spotmac.de
Chealion
Vaia! O plist.spotmac.de parece ter sumido. :-(
docwhat

Respostas:

44

Método Gui

Se você deseja que algo seja executado quando um usuário efetua login, a maneira mais fácil é usar a GUI. Você pode

  • Vá para a System Prefs > Accounts > Login Itemstela e adicione o item lá
    • clicando no +símbolo
    • arrastando e soltando o .appno painel
  • No dock, abra o menu de contexto de um aplicativo, selecione Optionse selecioneOpen at Login

Método Launchd

Se você deseja iniciar algo que não é um .app, ou deseja ter mais controle sobre o lançamento, como:

  • em um determinado momento ou em um intervalo especificado
  • relançando continuamente se travar
  • não relacionado ao login do usuário
  • em função do acesso à rede
  • executar somente quando outro processo estiver em execução
  • quando um arquivo é adicionado a uma pasta
  • etc.

então você deseja usar a solução técnica que é launchd.

A maneira mais fácil de configurar um launchdarquivo de configuração é usar uma ferramenta para ajudar. No momento da redação, o método mais popular é o Lingon (que tem uma versão gratuita mais antiga disponível no SourceForge), ou a ferramenta PList Website .

Codificação manual

Se você não quiser usar o Lingon ou o site PList e quiser usar apenas as ferramentas brutas disponíveis no sistema, poderá escrever suas próprias launchd plistmanualmente

Aqui está o meu script launchd para executar o SomeApp continuamente após a inicialização do sistema (independente do login de um usuário). Ele está em / System / Library / LaunchAgents / e é chamado SomeApp.restart.plist. Se for executado com base no login de um usuário, poderá ser armazenado em ~ / Library / LaunchAgents /

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>RunAtLoad</key>  
        <true/>
        <key>KeepAlive</key>
        <true/>
        <key>Label</key>
        <string>SomeApp.restart</string>
        <key>ProgramArguments</key>
        <array>
                <string>/path/to/SomeApp.app/Contents/MacOS/SomeApp</string>
        </array>
        <key>StartCalendarInterval</key>
        <dict>
            <key>Hour</key>
            <integer>5</integer>
            <key>Minute</key>
            <integer>10</integer>
       </dict>
</dict>
</plist>

Carregue uma vez com

launchctl load ~/Library/LaunchAgents/SomeApp.restart.plist
  • A RunAtLoadopção iniciará o aplicativo na primeira vez que o launchctl executar isso.
  • A KeepAliveopção reiniciará o aplicativo se ele falhar.
  • O StartCalendarIntervalexecutará em um determinado momento. Presumivelmente, isso é mutuamente exclusivo dos dois anteriores, mas está incluído para mostrar o que pode ser feito comlaunchd
  • O Launchctl executará isso após a reinicialização.

Há muitas opções adicionais que podem ser encontrados através da experimentação de Lingon ou lendo as páginas do manual para launchctl, launchd.plist, plist, launchd.conf, etc.


fonte
Obrigado, realmente útil. Você também pode usar launchctl load -w ...para tornar a alteração persistente. Com base no seu feedback que eu atualizei meu roteiro PowerUser configurador OSX
Sorin
8

Lingon ainda funciona. Eu apenas o usei na semana passada para criar uma "tarefa agendada". Depois de baixá-lo, tive que usar seu atualizador automático para obter a versão mais recente, mas funciona bem.

Robert S Ciaccio
fonte
1
Lingon também está agora na App Store
user151019
1
Mas, para encontrar a versão gratuita e de código aberto, você precisa desenterrá-la do Sourceforge. A última versão comercial também não funciona no Leopard (10.5). Mas a versão 2.1.1 - consulte sourceforge.net/projects/lingon/files/Lingon/2.1.1
nealmcb
7

Se for necessário executar apenas quando o sistema for inicializado, use a guia Itens de login do painel de preferências Contas em Preferências do sistema.

texto alternativo

Se for um script, use o AppleScript Editor para salvá-lo como um aplicativo. Se não for um script AppleScript, você ainda poderá usar o AppleScript para executar o script desta forma:

do shell script "your script here"

ghoppe
fonte
Hã ? Você tem certeza sobre isso ? Ele diz na interface do usuário da sua captura de tela "Esses itens serão abertos automaticamente quando você faz login" - não é diferente de quando o sistema é inicializado? Além disso, seu link parece 404.
ssc
5

Não se esqueça do Loginhooks.

Embora eles sejam executados como root, você deve poder executar um script $ HOME / .loginhook usando algo como isto:

#!/bin/sh

home=`eval echo ~$user`

if [ -x "$home/.loginhook" ]; then
    logger -t $0 "executing .loginhook of user $user"
    su - $user -c "$home/.loginhook"
fi

Em seguida, basta adicionar os comandos que você deseja ao ~ / .loginhook

Além disso, embora 'launchd' seja "o caminho do Mac", o crontab ainda é uma opção perfeitamente viável e é muito mais fácil de editar manualmente do que os arquivos XML launchd.

Pessoalmente, paguei alegremente US $ 5 pelo Lingon .

TJ Luoma
fonte
Portanto, o script no bloco de código deve ser salvo como /path/to/script, e sudo defaults write com.apple.loginwindow LoginHook /path/to/script? E o ponto de executar um script no diretório inicial é que cada usuário pode ter um costume (ou não) ~/.loginhook?
Lri
@Lri - sim, precisamente. Desculpe, isso não estava mais claro. O código do bloco pode ser /usr/local/bin/loginhook.sh e, como é executado pela raiz, ele procura um $ HOME / .loginhook quando um usuário efetua login e o executa como esse usuário.
TJ Luoma
4

A execução de um aplicativo em um horário especificado pode ser feita facilmente no iCal, como acabei de descobrir graças a outro fórum!

  1. Faça um novo evento no iCal durante o tempo que você deseja que o aplicativo seja aberto.
  2. Em 'Alerta', escolha 'Abrir arquivo' - portanto, você pode definir um arquivo para abrir, o que obviamente também abrirá o aplicativo padrão para esse tipo de arquivo.
  3. Para abrir um aplicativo, em vez de um arquivo, altere o menu suspenso 'iCal' para 'Outros ...' e escolha o aplicativo que você deseja executar!

Uma coisa a ter em atenção é que, se você tiver vários Macs compartilhando coisas pelo iCloud, esse evento também será executado nos aplicativos que você pode ou não desejar. Para que isso ocorra apenas em um único Mac, é necessário criar o evento em um calendário 'No meu Mac', que você pode fazer da seguinte maneira ...

  1. Oculte todos os outros calendários compartilhados do iCloud ou na barra esquerda, passando o mouse sobre o nome do calendário e clicando no botão 'ocultar' que será exibido.
  2. Agora clique com o botão direito do mouse (ou clique em Opção, se você é um cretino completo e ainda não percebeu que tem mais de um dedo e pode alterar as preferências do mouse para que ele seja um pouco mais útil do que o estado padrão de 'tijolo cretinoso para cretinos') ) e escolha 'Novo calendário'.
  3. Como todas as agendas compartilhadas estão ocultas, esse novo calendário será criado como 'No meu Mac' e será local para este Mac.

Eu mesmo acabei de descobrir isso e fiquei agradavelmente surpreso com as duas dicas, então pensei em compartilhá-las aqui.

Eu recebi as informações dessas pessoas úteis por aqui ... então, obrigado!

http://osxdaily.com/2013/04/15/launch-file-app-scheduled-date-mac-os-x/

Slowboy
fonte