Sistem yeniden başlatıldığında otomatik olarak sonsuza kadar (düğüm) başlat


190

Düğüm sunucumu çalışır durumda tutmak için düğümün sonsuza kadar modülünü kullanıyorum. Ancak sistem yeniden başlatıldığında sonsuza dek sona erer. Sistem yeniden başlatıldığında düğüm sunucusunu (sonsuza dek) otomatik olarak başlatabileceğim bir yol var mı?


1
Bu sunucu bulutta mı? Bunun için herhangi bir önyükleme komut dosyanız var mı?
Jorge Aranda

6
Ödeme PM2 ! Ayrıca başlangıç ​​komut dosyası oluşturma (systemd, systemv ...) pm2.keymetrics.io/docs/usage/startup
Unitech

Yanıtlar:


344

Ben crontab kullanmanızı öneririm. Kullanımı kolaydır.

Nasıl

  1. Düzenlemeye başlamak için, "testuser" ı düğüm işlemi için istediğiniz çalışma zamanı kullanıcısıyla değiştirerek aşağıdakileri çalıştırın. Kendinizden farklı bir kullanıcı seçerseniz, bunu sudo ile çalıştırmanız gerekir.

    $ crontab -u testuser -e
  2. Bunu daha önce hiç yapmadıysanız, hangi düzenleyiciyle düzenlemek istediğinizi soracaktır. Vim'i seviyorum, ancak kullanım kolaylığı için nano'yu önereceğim.

  3. Editöre girdikten sonra aşağıdaki satırı ekleyin:

    @reboot /usr/local/bin/forever start /your/path/to/your/app.js
  4. Dosya 'yı kaydet. Cron'un kurulduğu hakkında bazı geri bildirimler almalısınız.

  5. Cron kurulumunun daha fazla doğrulanması için, şu anda yüklü olan cronsları listelemek için aşağıdakileri (tekrar "testuser" yerine hedef kullanıcı adınız yerine) uygulayın:

    $ crontab -u testuser -l 

Bence, cron'da ikili dosyalar yürütürken her zaman tam yollar kullanmanız gerektiğini unutmayın. Ayrıca, sonsuza kadar komut dosyanızın yolu doğru değilse which forever, tam yolu almak için çalıştırın .

Bu foreverçağrılar göz önüne alındığında, nodeaşağıdakilerin tam yolunu da vermek isteyebilirsiniz node:

@reboot /usr/local/bin/forever start -c /usr/local/bin/node /your/path/to/your/app.js

Daha fazla okuma


2
Bu yaklaşım iyidir, ancak yalnızca sistemin yeniden başlatıldığı durumlar için. Sunucu kapatılıp sonra açılırsa - bu cron işi yürütülmez.
ekdeveloper

6
Sizi böyle düşündüren nedir? en.wikipedia.org/wiki/Cron#Predefined_scheduling_definitions@reboot Cronların cron deamon başlangıcında çalıştırıldığını açıklar . Eklemek için ayarlanmış olan cron'ların @rebootsistem önyüklemesinde çalışmadığını gösteren bir durumla karşılaşmadım . Kapatma şekliniz bununla alakasız.
Julian Lannigan

16
/homehenüz bağlı değil gibi görünüyor , bu yüzden kodunuz yaşıyorsa bu işe yaramaz /home.
chovy

6
Yukarıdakilerin benim için başarısız olduğunu gördüm çünkü cron -c seçeneğiyle bile sonsuza kadar çalışmaya çalıştığında düğüm yolunda değil. Ancak, zamanlama ifadelerinin üzerinde olduğu sürece doğrudan crontab'a bir PATH = ifadesi ekleyebileceğiniz ortaya çıkıyor. PATH ayarlandıktan sonra @reboot ifadesi bir rüya gibi çalıştı.
YorkshireKev

2
@Chovy yorumunuz için teşekkürler, çok yardımcı oldu. Bashrc'den ortam değişkenleri kullananlar için yorumuna dikkat edin. / Home monte edilmediğinden çalışmaz. Crontab komutundaki değişkenleri şu şekilde ayarlayın@reboot varname=value ...
lsborg

123

Bunu yapmak için sonsuza kadar hizmet kullanabilirsiniz.

npm install -g forever-service
forever-service install test

Bu işlem, geçerli dizinde app.js'yi sonsuza dek bir hizmet olarak sağlayacaktır. Sistem her yeniden başlatıldığında hizmet otomatik olarak yeniden başlatılır. Ayrıca durduğunda zarif bir durmaya çalışacaktır. Bu komut dosyası da logrotate komut dosyasını içerir.

Github URL'si: https://github.com/zapty/forever-service

NOT: Ben sonsuza dek hizmetin yazarıyım.


2
-E "PORT = 80 ENV = eşya FOO = bar" seçeneğini kullanın
arva

2
Sonsuza kadar nasıl hizmet edeceğimi anlamıyorum. "Sonsuza kadar hizmet yükleme testi" nde "test" nedir? Uygulamamı sonsuza kadar başlatma komutum: "/ usr / local / bin / sonsuza dek start -c / usr / local / bin / node / home / alex / public / node_modules / http-server / bin / http-server -s - d yanlış ". Ne yazmam gerekir?
Alex,

3
Burada test hizmetin adıdır. forever-service install testini çalıştırdığınızda test olarak adlandırılan bir hizmet yaratır, app.js'yi bu dizinde bir hizmet olarak çalıştırılmak üzere çalıştırır. Gihub sayfasındaki yardım belgelerini okumanızı ve anlayamıyorsanız bir sorun eklemenizi öneririm.
arva

6
@Alex - arva'nın açıklamasını netleştirmek için - örnekte forever-service install test, hizmetintest adı olacak , ancak çalıştırılacak gerçek program / düğüm .js dosyasının adı olmayacaktır. Varsayılan olarak, programın adıdır varsayar , ancak bunu geçersiz kılabilirsiniz aşağıdaki gibi bayrak: . (Test edilmedi, sözdizimi ayrıntıları yanlışsa lütfen beni düzeltin.)app.js--scriptforever-service install test --script main.js
Dan Nissenbaum

3
@DanNissenbaum Yanıtladığınız için teşekkür ederiz. Şimdi güzel çalışan PM2 kullanıyorum. Talimatlar: digitalocean.com/community/tutorials/…
Alex

26
  1. PM2'yi NPM kullanarak global olarak yükleyin

    npm install pm2 -g

  2. Komut dosyanızı pm2 ile başlatın

    pm2 start app.js

  3. etkin bir başlangıç ​​komut dosyası oluşturma

    pm2 startup

    NOT: pm2 başlangıcı, sistem yeniden başlatıldığında PM2'yi başlatmak içindir. PM2 bir kez başladığında, sistem kapanmadan yönettiği tüm süreçleri yeniden başlatır.

Otomatik başlatmayı devre dışı bırakmak istiyorsanız, pm2 unstartup komutunu kullanın

Başlangıç ​​komut dosyasının başka bir kullanıcı altında yürütülmesini istiyorsanız, -u <username>seçeneği kullanın ve--hp <user_home>:


Lütfen aynı cevabı birden fazla soruya göndermeyin.
FelixSFD

PM2'nin nasıl rafine edildiğini gerçekten çok seviyorum ve harika bir izleme aracıyla geliyor. Umarım bu diğerleri için daha fazla vurgulanır. @ rv7 Bunu gördüğünüzden eminim, ancak bir windows çözümü var: npmjs.com/package/pm2-windows-service . Yine de kendim denemedim.
John Lee

26

Bu durum Debian için geçerlidir.

Aşağıdakileri şuraya ekle: /etc/rc.local

/usr/bin/sudo -u {{user}} /usr/local/bin/forever start {{app path}}

  • {{user}} kullanıcı adınızın yerine geçer.
  • {{app path}}uygulama yolunuzun yerini alır. Örneğin,/var/www/test/app.js

2
Bu yöntem zarif kapatmalarla uğraşmaz, ancak birçok insan için bu muhtemelen bir sorun değildir.
UpTheCreek

6
BTW - Sanırım düzenlememelisiniz /etc/rc.local, değil/etc/init.d/rc.local
UpTheCreek

@UpTheCreek ile /etc/rc.local'ın bunu eklemek için daha uygun bir yer olduğunu kabul edin - harika bir açıklama için bkz: unix.stackexchange.com/a/59945 .
Yani Üzeri O

2
Ayrıca, app.jsgöreli dosyaların doğru yüklendiğinden emin olmak için 'geçerli çalışma dizinini' belirtmek isteyebilirsiniz - process.chdir('/your/path/to/your/app'); Node.js ref docs here
So Over It

1
Node.JS komut dosyanız için ortam değişkenlerini ayarlamanız gerekiyorsa (ifade için $ PORT gibi), /etc/rc.local benim için hile yapmak için( cd /path/to/project && /usr/bin/sudo -u {{user}} env PORT={{port number}} PATH=$PATH:/usr/local/bin sh -c "forever start app.js" )
ekleyin

11

Bu cevaptan ve bu blog yazısından ilham alan alternatif bir crontab yöntemi .

1. Bir bash komut dosyası oluşturun (bob'u istediğiniz kullanıcıya değiştirin).

vi /home/bob/node_server_init.sh

2. Bunu yeni oluşturduğunuz dosyanın içine kopyalayıp yapıştırın.

#!/bin/sh

export NODE_ENV=production
export PATH=/usr/local/bin:$PATH
forever start /node/server/path/server.js > /dev/null

Yukarıdaki yolları yapılandırmanıza göre düzenlediğinizden emin olun!

3.Bash betiğinin yürütülebildiğinden emin olun.

chmod 700 /home/bob/node_server_init.sh

4. Bash komut dosyasını test edin.

sh /home/bob/node_server_init.sh

5. "bob" i, düğüm için çalışma zamanı kullanıcısıyla değiştirin.

crontab -u bob -e

6. Kopyalayıp yapıştırın (bob'u istediğiniz kullanıcıya değiştirin).

@reboot /bin/sh /home/bob/node_server_init.sh

Crontab'ı kaydedin.

Sonuna kadar yaptın, ödülün bir yeniden başlatma (test etmek için) :)


Bu yöntem benim için en iyi sonucu verdi. Server.js dosyasının tam yolunu koyduğumda sonsuza dek bırakılır. Aynı dizinde çalıştırırsam, foreveer iyi çalışır. Başarısız olmasının nedeni, server.js dosyasının diğer dosyaları içermesi, ancak yolların dağılmış olmasıdır. Bu yöntemi kullanarak, dizine .sh komut dosyamda CD, sonra oraya göre her şeyi çalıştırmak olabilir.
BeardedGeek

9

Ekteki sorudan cevap kopyalandı .

PM2'yi kullanabilirsiniz , bu yerleşik bir yük dengeleyici node.js uygulamalar için bir üretim prosesi yönetici.

PM2'yi yükle

$ npm install pm2 -g

Bir uygulama başlatın

$ pm2 start app.js

Express kullanıyorsanız, uygulamanızı aşağıdaki gibi başlatabilirsiniz:

pm2 start ./bin/www --name="app"

Çalışan tüm işlemleri listeleme:

$ pm2 list

Tüm işlemleri listeleyecektir. Daha sonra, aşağıdaki komutla uygulamanın kimliğini veya Adını kullanarak hizmetinizi durdurabilir / yeniden başlatabilirsiniz.

$ pm2 stop all                  
$ pm2 stop 0                    
$ pm2 restart all               

Günlükleri görüntülemek için

$ pm2 logs ['all'|app_name|app_id]

Sistem önyüklemesinde OTOMATİK OLARAK nasıl başlar ? CLI manuel yazmayı kopyaladınız / yapıştırdınız
Green

@Yeşil, Çalıştır, $pm2 startupBundan sonra pm2'nin manuel olarak bir komut çalıştırmasını, kopyalayıp çalıştırmasını istediğini göreceksiniz. Sonra, $pm2 saveşimdi app.js sistem yeniden başlatmaya devam edecek
yajnesh

7

Bunun için /etc/init.d klasöründe bir kabuk komut dosyası oluşturmanız gerekir. Hiç yapmadıysanız biraz karmaşıktır, ancak init.d komut dosyalarında web üzerinde bol miktarda bilgi vardır.

Sonsuza dek bir CoffeeScript sitesini çalıştırmak için oluşturduğum bir komut dosyası örneği:

#!/bin/bash
#
# initd-example      Node init.d 
#
# chkconfig: 345 
# description: Script to start a coffee script application through forever
# processname: forever/coffeescript/node
# pidfile: /var/run/forever-initd-hectorcorrea.pid 
# logfile: /var/run/forever-initd-hectorcorrea.log
#
# Based on a script posted by https://gist.github.com/jinze at https://gist.github.com/3748766
#


# Source function library.
. /lib/lsb/init-functions


pidFile=/var/run/forever-initd-hectorcorrea.pid 
logFile=/var/run/forever-initd-hectorcorrea.log 

sourceDir=/home/hectorlinux/website
coffeeFile=app.coffee
scriptId=$sourceDir/$coffeeFile


start() {
    echo "Starting $scriptId"

    # This is found in the library referenced at the top of the script
    start_daemon

    # Start our CoffeeScript app through forever
    # Notice that we change the PATH because on reboot
    # the PATH does not include the path to node.
    # Launching forever or coffee with a full path
    # does not work unless we set the PATH.
    cd $sourceDir
    PATH=/usr/local/bin:$PATH
    NODE_ENV=production PORT=80 forever start --pidFile $pidFile -l $logFile -a -d --sourceDir $sourceDir/ -c coffee $coffeeFile

    RETVAL=$?
}

restart() {
    echo -n "Restarting $scriptId"
    /usr/local/bin/forever restart $scriptId
    RETVAL=$?
}

stop() {
    echo -n "Shutting down $scriptId"
    /usr/local/bin/forever stop $scriptId
    RETVAL=$?
}

status() {
    echo -n "Status $scriptId"
    /usr/local/bin/forever list
    RETVAL=$?
}


case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status
        ;;
    restart)
        restart
        ;;
    *)
        echo "Usage:  {start|stop|status|restart}"
        exit 1
        ;;
esac
exit $RETVAL

Init.d komut dosyaları kök olarak çalıştırıldığından beri klasör ve PATHs açıkça ayarlanmış veya kök kullanıcı tarafından kullanılabilir emin olmak zorunda kaldı.


2
İnit.d ile başlayan herhangi bir bağımlılığınız varsa, yine de yükleme sırası sorunlarınız olabilir.
UpTheCreek

@ alexandru.topliceanu Bağlantıyı düzelttim.
Hector Correa

6

kullan PM2

Hangi sunucu üretim sunucusunu çalıştırmak için en iyi seçenek

Uygulamanızı bu şekilde çalıştırmanın avantajları nelerdir?

  • PM2, çökmesi durumunda uygulamanızı otomatik olarak yeniden başlatır.

  • PM2, işlenmeyen istisnalarınızın bir kaydını tutar - bu durumda, /home/safeuser/.pm2/logs/app-err.log adresindeki bir dosyada.

  • Bir komutla PM2, yönettiği tüm uygulamaların sunucu yeniden başlatıldığında yeniden başlatılmasını sağlayabilir. Temel olarak, düğüm uygulamanız bir hizmet olarak başlayacaktır.

ref: https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps


5

Sonsuza kadar düğüm uygulamalarının hizmet olarak çalışmasını sağlamak için yapılmadı. Doğru yaklaşım ya / etc / inittab girişi (eski linux sistemleri) ya da yeni bir başlangıç ​​(daha yeni linux sistemleri) oluşturmaktır.

Bunu bir başlangıç ​​olarak nasıl ayarlayacağınızla ilgili bazı belgeler: https://github.com/cvee/node-upstart


Upstart CentOS'ta başarısız oldu ve kaybolacağını okudum. Bir init.d girişi oluşturmak gerçekten kullanıcı dostu bir yol değildir, ancak sanırım linux :)
Jorre

5

crontabCentOS x86 6.5'te benim için çalışmıyor. @reboot çalışmıyor gibi görünüyor.

Sonunda bu çözümü aldım:

Düzenle: /etc/rc.local

sudo vi /etc/rc.local

Bu satırı dosyanın sonuna ekleyin. Değişim USER_NAMEve PATH_TO_PROJECTkendi başına. NODE_ENV=productionuygulamanın üretim modunda çalıştığı anlamına gelir. Birden fazla node.js uygulaması çalıştırmanız gerekiyorsa daha fazla satır ekleyebilirsiniz.

su - USER_NAME -c "NODE_ENV=production /usr/local/bin/forever start /PATH_TO_PROJECT/app.js"

NODE_ENVAyrı bir satırda ayarlamayın , uygulamanız geliştirme modunda çalışmaya devam eder, çünkü sonsuza kadar almaz NODE_ENV.

# WRONG!
su - USER_NAME -c "export NODE_ENV=production"

Kaydet ve vi'dan çık (bas ESC : w q return). Sunucunuzu yeniden başlatmayı deneyebilirsiniz. Sunucunuz yeniden başlatıldıktan sonra, ssh aracılığıyla uzaktan herhangi bir hesaba giriş yapmasanız bile node.js uygulamanız otomatik olarak çalışmalıdır.

Kabuğuna NODE_ENVçevre kursan iyi olur . NODE_ENVhesabınız USER_NAMEoturum açtığında otomatik olarak ayarlanır .

echo export NODE_ENV=production >> ~/.bash_profile

Böylece /PATH_TO_PROJECT/app.jsssh ile sonsuza dek dur / başlat gibi komutları NODE_ENVtekrar ayarlamadan çalıştırabilirsiniz .


debian 7.6'da aynı sorunu var. Bu benim için düzeltildi. Çok teşekkürler.
Daniele Vrut

'Sonsuza kadar' kullanmak istemiyorsanız, satırı 'su - USER_NAME -c "NODE_ENV = üretim düğümü / PATH_TO_PROJECT / bin / www"' olarak değiştirebilirsiniz.
yaobin

3

Tam olarak bunu yapan bir senaryo yazdım:

https://github.com/chovy/node-startup

Sonsuza kadar denemedim, ancak çalıştığı komutu özelleştirebilirsiniz, bu yüzden düz olmalıdır:

/etc/init.d/node-app start
/etc/init.d/node-app restart
/etc/init.d/node-app stop

2

Rc.local ile ilgili sorun, komutlara kullanıcı olarak oturum açmaktan ve sudo kullanmaktan farklı bir kök olarak erişilmesidir.

Etc / profile.d istediğim başlangıç ​​komutları ile bir .sh betiği ekleyerek bu sorunu çözdüm. Profile.d içindeki herhangi bir .sh dosyası otomatik olarak yüklenir ve herhangi bir komut, normal sudo kullanmış gibi işlem görür.

Bunun tek dezavantajı, belirtilen kullanıcının benim durumumda her zaman böyle olduğu şeyleri başlatmak için oturum açması gerekiyor.


1

Yukarıdaki cevapların çoğunu denedim. Hiçbiri benim için çalışmadı. Uygulamam /homeroot olarak değil, kullanıcı olarak ve kullanıcı olarak kurulur . Bu muhtemelen, yukarıda belirtilen başlangıç ​​komut dosyaları çalıştığında,/home henüz bağlanmadığı için uygulamanın başlatılmadığı anlamına gelir.

Sonra bu talimatları Digital Ocean tarafından buldum:

https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-environment-on-an-ubuntu-vps

PM2'yi açıklandığı gibi kullanmak çok basitti ve mükemmel çalışıyor: Sanal sunucularım iki fiziksel çökme yaşadı - kesinti süresi sadece bir dakikaydı.


PM2, github'da sonsuza kadar çok daha fazla yıldıza (2x) sahiptir ve ayrıca daha fazla özelliğe sahiptir. Bence cevapların çoğu burada kullanılmıyor.
inf3rno

0

tam örnek crontab (/ etc / crontab adresinde bulunur) ..

#!/bin/bash

# edit this file with .. crontab -u root -e
# view this file with .. crontab -u root -l

# put your path here if it differs
PATH=/root/bin:/root/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin

# * * * * * echo "executes once every minute" > /root/deleteme

@reboot cd /root/bible-api-dbt-server; npm run forever;
@reboot cd /root/database-api-server; npm run forever;
@reboot cd /root/mailer-api-server; npm run forever;

-2

Düğümünüzü sonsuza kadar başlatmak için kabuğunuzda aşağıdaki komutu kullanabilirsiniz:

forever app.js //my node script

Uygulamanızın çalıştığı sunucunun her zaman açık kalması gerektiğini unutmayın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.