2013-09-04 10 views
9

Próbuję napisać plik launchd.plist dla mojego serwera węzła. Używam na zawsze, aby uruchomić mój serwer węzła. Chciałbym, aby serwer uruchamiał się przy starcie. Chciałbym także poczekać, aż plik mongodb launchd plist zostanie uruchomiony jako pierwszy.OSD launchd plist dla węzła na zawsze proces

Zainstalowałem mongobb używając homebrew i przyszedł już z launchd.plist. Mam realizowane następujące:

$ launchctl load ~/Library/LaunchAgents/homebrew.mxcl.mongodb.plist 

plist dla MongoDB jest:

<!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>homebrew.mxcl.mongodb</string> 
    <key>ProgramArguments</key> 
    <array> 
    <string>/usr/local/opt/mongodb/mongod</string> 
    <string>run</string> 
    <string>--config</string> 
    <string>/usr/local/etc/mongod.conf</string> 
    </array> 
    <key>RunAtLoad</key> 
    <true/> 
    <key>KeepAlive</key> 
    <false/> 
    <key>WorkingDirectory</key> 
    <string>/usr/local</string> 
    <key>StandardErrorPath</key> 
    <string>/usr/local/var/log/mongodb/output.log</string> 
    <key>StandardOutPath</key> 
    <string>/usr/local/var/log/mongodb/output.log</string> 
    <key>HardResourceLimits</key> 
    <dict> 
    <key>NumberOfFiles</key> 
    <integer>1024</integer> 
    </dict> 
    <key>SoftResourceLimits</key> 
    <dict> 
    <key>NumberOfFiles</key> 
    <integer>1024</integer> 
    </dict> 
</dict> 
</plist> 

Gdybym wyłączenia komputera i ponownie MongoDB odpala się tak jak powinno.

Jednak mój serwer węzła nie uruchamia się. Jakieś pomysły?

<?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>KeepAlive</key> 
     <dict> 
      <key>SuccessfulExit</key> 
      <false/> 
     </dict> 
     <key>Label</key> 
     <string>com.test.app</string> 
     <key>ProgramArguments</key> 
     <array> 
      <string>/usr/local/bin/forever</string> 
      <string>-a</string> 
      <string>-l</string> 
      <string>/var/log/app/app.log</string> 
      <string>-e</string> 
      <string>/var/log/app/app_error.log</string> 
      <string>/data/server/app.js</string> 
     </array> 
     <key>RunAtLoad</key> 
     <true/> 
     <key>StartInterval</key> 
     <integer>3600</integer> 
    </dict> 
</plist> 

EDIT:

pisanie do pliku dziennika i widzę to:

env: węzeł: Nie ma takiego pliku lub katalogu

Myślę, że to oznacza, że ​​węzeł nie można znaleźć pliku binarnego. Mogę echo $ PATH i/usr/local/bin jest na mojej ścieżce. Mogę uruchomić węzeł z terminala. Pomysły?

Odpowiedz

1

Add node zanim na zawsze:

<key>ProgramArguments</key> 
<array> 
    <string>/usr/local/bin/node</string> 
    <string>/usr/local/bin/forever</string> 
    <string>/path/to/app.js</string> 
</array> 
+0

To nie działa zgodnie z oczekiwaniami. Mimo że uruchomi 'app.js', nie będziesz mógł zobaczyć go działającego na zawsze z' sudo forever list' lub 'forever list'. – jczaplew

+0

musisz wstawić uruchomić przed app.js silny, to możesz wyświetlić listę wszystkich aplikacji węzła z uruchomionym ... – erwin

6

miałem ten problem zbyt, ale rozwiązać go za pomocą aplikacji Automator, który działa przy starcie.

  1. Otwarte Automator i wybierz New Application

  2. Insert w obiegu "Run Shell Script"

  3. użyć tego kodu w skrypcie powłoki, zmiana ścieżki do ścieżki

export PATH=/usr/local/bin/:$PATH 
cd /path/to/your/nodejs/app 
forever start app.js 
  1. Przejdź do Preferencje systemowe >> Użytkownik & Grupy i kliknij kartę Elementy logowania

  2. Dodaj swoją aplikację Automator i bądź szczęśliwy.

Ważną częścią rozwiązania jest pierwsza linia skryptu (dodanie do ścieżki bin). Prawdopodobnie działałoby również dodawanie elementu startowego wskazanego na skrypcie basha (i bez skryptu Automatora), nie krępuj się wypróbować!

+0

Po wypróbowaniu launchem demonów, /etc/rc.common i wszystkich innych rzeczy, które mogłem znaleźć, to Automator. Aplikacja jest najlepszym sposobem na osiągnięcie tego. – Dimitris

9

Dodaj środowisko Zmienione dla mnie zmienne.

<key>EnvironmentVariables</key> 
<dict> 
    <key>PATH</key> 
    <string>/usr/local/bin/:$PATH</string> 
</dict> 

Może być konieczne dodanie WorkingDirectory do aplikacji węzła.

<key>WorkingDirectory</key> 
<string>path/to/your/node/app</string> 
+0

rozwiązał moje problemy, próbując uruchomić 'bash -c node.js' – terrace

0

Nie jestem pewien, kiedy wyszedł node-launchd. Wydaje się jednak, że jest to bardziej niezawodne rozwiązanie.

Rozwiązanie, w którym przepływ pracy jest tworzony i dodawany do elementu logowania, również jest doceniane. Problem polega jednak na tym, że jeśli aplikacja jest serwowana na serwerze, a po ponownym uruchomieniu serwera, zastanawiam się, czy aplikacja zostanie uruchomiona przed zalogowaniem użytkownika do systemu. Nie próbowałem jednak.

0

To nie jest odpowiedź na oryginalne pytania, ale szukałem prostego sposobu na uruchomienie serwera węzła (i kontynuowanie działania) po ponownym uruchomieniu komputera. Zauważyłem, że pm2 jest o wiele łatwiejsze do skonfigurowania niż powyższe rozwiązania dla forever.

# install pm2 
npm install pm2 -g 

# start server 
pm2 start app.js 

# start pm2 after reboot (might need sudo) 
$ pm2 startup 

http://pm2.keymetrics.io/docs/usage/startup/