como obter scripts de shell para executar na inicialização no Yosemite

21

Há um diretório no Sistema / Biblioteca para itens de inicialização que eu presumo: StartupItems

Preciso ter um script de shell que configure a interface Ethernet na inicialização, com endereço de rede local e máscara de sub-rede. Preciso fazer isso porque as preferências de rede para configurar a interface Ethernet NÃO a definirão usando configurações manuais. Isso parece ser um bug sério ou a minha instalação está ruim.

Recebi o conselho de usar a configuração de rede na linha de comando, mas isso não configurará a interface Ethernet de tal maneira que as configurações estejam lá na reinicialização.

O script precisa fazer seu trabalho com privilégios de root ou com o sudo, mas estou assumindo que, se ele usar o sudo, haverá uma caixa de diálogo de senha apresentada no momento da inicialização quando o processo de inicialização chegar ao script.

(Eu tive experiência suficiente com FreeBsd e Linux para encontrar o caminho no terminal, mas não necessariamente como se aplica ao Mac OSX)

JeffK
fonte

Respostas:

18

Uma maneira de fazer isso seria atribuir ao script um serviço launchd:

Crie o script de shell como de costume. Em seguida, você pode criar um serviço launchd para executá-lo na inicialização. Aqueles estão localizados em /Library/LaunchDaemons. Eles estão no formato da lista de propriedades XML. Crie outro e preencha-o com algo como isto:

<?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>Label</key>
        <string>com.example.app</string>
        <key>ProgramArguments</key>
        <array>
            <string>/bin/sh</string>
            <string>/path/to/script</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>KeepAlive</key>
        <false/>
    </dict>
</plist>

Mudança com.example.app, /bin/she /path/to/scriptconforme necessário.

O script será executado enquanto o sistema estiver inicializando. Se for executado muito cedo, você pode escrever o script para tentar fazer o que ele precisa fazer até que seja bem-sucedido ou deixá-lo sair com um código de erro diferente de zero e adicioná-lo à lista de propriedades antes da </dict>linha:

<key>KeepAlive</key>
<dict>
     <key>SuccessfulExit</key>
     <false/>
</dict>

Para obter mais informações sobre os daemons e serviços de lançamento do OS X, sugiro procurar aqui uma boa referência rápida sobre como fazê-los, ou aqui uma referência mais abrangente sobre o que o launchd pode fazer.

andonuts
fonte
Como você chama esse documento? E o / path / to / script == / Sistema / Biblioteca / StartupItems / script?
JeffK
11
Para a primeira pergunta: O nome do documento plist geralmente usa o que a chave Label na lista de propriedades está configurada (neste caso, "com.example.app") com uma extensão .plist.
andonuts
11
Para a segunda pergunta: Isso está correto, mas o script deve ser movido para outro lugar.
andonuts
Seu plist está mal formado. Você precisa de uma chave: <key>Program</key>com o valor <string>/bin/sh</string>e, em seguida, <key>ProgramArguments</key>deve apenas ter o valor<string>/path/to/script</string>
Jon Brooks
Na verdade, o meu é errada também: <key>ProgramArguments</key>precisa ser uma matriz ..
Jon Brooks
16

Há algum tempo, usei o cron para fazer exatamente isso. Você pode fazer uma entrada como esta

@reboot /path/to/my/script

Mais informações aqui

Em vez dos cinco primeiros campos, uma das oito seqüências especiais pode aparecer:

       string          meaning
       ------          -------@reboot ------@reboot
       @reboot         Run once, at startup.
       @yearly         Run once a year, "0 0 1 1 *".
       @annually       (same as @yearly)
       @monthly        Run once a month, "0 0 1 * *".
       @weekly         Run once a week, "0 0 * * 0".
       @daily          Run once a day, "0 0 * * *".
       @midnight       (same as @daily)
       @hourly         Run once an hour, "0 * * * *".
sjosen
fonte
11
Muito útil para saber!
21815 geotheory
7
cronnão é o caminho certo para fazer isso no OS X atualmente. Use LaunchAgent ou LaunchDeamon (launchd). Para obter mais informações: developer.apple.com/library/mac/documentation/MacOSX/Conceptual/… Although it is still supported, cron is not a recommended solution. It has been deprecated in favor of launchd.
CousinCocaine
4
croné muito mais fácil de configurar do que launchd, no entanto. Basta comparar as duas respostas nesta discussão para ver o que quero dizer. cronusa uma única linha em um único arquivo, onde launchdprecisa de um script para descrever o script que você deseja executar na inicialização.
Dannid 22/09/2015
@Dannid Kron não é sensível para executar duplicação, buffer de fila e outros. Embora viável neste caso, nem sempre é uma chave de esqueleto, nem é uma solução idiomática.
New Alexandria
Crontab é muito melhor. É rápido, sujo e há muito estabelecido no mundo Unix. Eu cavo totalmente essa palavra-chave @reboot.
#