Tự động bắt đầu mãi mãi (nút) khi khởi động lại hệ thống


190

Tôi đang sử dụng mô-đun mãi mãi của nút để giữ cho máy chủ nút của tôi chạy. Tuy nhiên, mãi mãi chấm dứt khi có một hệ thống khởi động lại. Có cách nào để tôi có thể tự động khởi động máy chủ nút (mãi mãi) khi hệ thống khởi động lại không?


1
Là máy chủ này trong đám mây? Bạn có bất kỳ kịch bản khởi động cho nó?
Jorge Aranda

6
Thanh toán PM2 ! Nó cũng hỗ trợ tạo tập lệnh khởi động (systemd, systemv ...) pm2.keymetrics.io/docs/usage/startup
Unitech

Câu trả lời:


341

Tôi sẽ đề nghị sử dụng crontab. Thật dễ dàng để sử dụng.

Làm thế nào để

  1. Để bắt đầu chỉnh sửa, hãy chạy phần sau thay thế "người kiểm tra" bằng người dùng thời gian chạy mong muốn của bạn cho quy trình nút. Nếu bạn chọn một người dùng khác ngoài chính mình, bạn sẽ phải chạy nó với sudo.

    $ crontab -u testuser -e
  2. Nếu bạn chưa bao giờ làm điều này trước đây, nó sẽ hỏi bạn muốn chỉnh sửa với trình soạn thảo nào. Tôi thích vim, nhưng sẽ giới thiệu nano để dễ sử dụng.

  3. Khi ở trong trình chỉnh sửa, thêm dòng sau:

    @reboot /usr/local/bin/forever start /your/path/to/your/app.js
  4. Lưu các tập tin. Bạn sẽ nhận được một số thông tin phản hồi rằng cron đã được cài đặt.

  5. Để xác nhận thêm về việc cài đặt cron, hãy thực hiện như sau (một lần nữa thay thế "người kiểm tra" bằng tên người dùng mục tiêu của bạn) để liệt kê các crons hiện được cài đặt:

    $ crontab -u testuser -l 

Lưu ý rằng theo tôi, bạn nên luôn luôn sử dụng các đường dẫn đầy đủ khi thực hiện các nhị phân trong cron. Ngoài ra, nếu đường dẫn đến tập lệnh mãi mãi của bạn không chính xác, hãy chạy which foreverđể có được đường dẫn đầy đủ.

Cho rằng forevercác cuộc gọi đó node, bạn cũng có thể muốn cung cấp đường dẫn đầy đủ đến node:

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

Đọc thêm


2
Cách tiếp cận này là tốt, nhưng chỉ cho những trường hợp khi hệ thống được khởi động lại. Nếu máy chủ bị tắt và sau đó bật nguồn - công việc định kỳ này sẽ không thực thi.
triển sinh thái

6
Điều gì làm cho bạn nghĩ? vi.wikipedia.org/wiki/Cron#Pred xác_scheduling_def địnhs Giải thích rằng @rebootcron's chạy trên cron deamon bắt đầu. Thêm vào đó, tôi chưa bao giờ gặp phải một tình huống có thể gợi ý rằng cron của tôi được đặt ở chế độ @rebootkhông chạy khi khởi động hệ thống. Cách bạn tắt nó là không liên quan cho việc này.
Julian Lannigan

16
nó dường như /homechưa được gắn kết, vì vậy điều này sẽ không hoạt động nếu mã của bạn tồn tại /home.
chovy

6
Tôi thấy rằng ở trên không thành công đối với tôi vì nút không nằm trong đường dẫn khi cron cố chạy mãi mãi, ngay cả với tùy chọn -c. Tuy nhiên, hóa ra bạn có thể thêm câu lệnh PATH = trực tiếp vào crontab miễn là nó nằm trên các câu lệnh. Khi PATH được thiết lập, câu lệnh @reboot hoạt động như một giấc mơ.
YorkshireKev

2
Cảm ơn bình luận của bạn @chovy, nó rất hữu ích. Đối với những người sử dụng các biến môi trường từ bashrc, hãy nhớ bình luận của anh ấy. Vì / nhà không được gắn kết nên nó sẽ không hoạt động. Đặt các biến tại lệnh crontab như@reboot varname=value ...
lsborg

123

Bạn có thể sử dụng dịch vụ mãi mãi để làm điều này.

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

Điều này sẽ cung cấp app.js trong thư mục hiện tại dưới dạng dịch vụ mãi mãi. Dịch vụ sẽ tự động khởi động lại mỗi khi hệ thống được khởi động lại. Ngoài ra khi dừng lại, nó sẽ cố gắng dừng lại duyên dáng. Kịch bản này cũng cung cấp kịch bản logrotate.

Github url: https://github.com/zapty/forver-service

LƯU Ý: Tôi là tác giả của dịch vụ mãi mãi.


2
Sử dụng tùy chọn -e "PORT = 80 ENV = prod FOO = bar"
arva 13/215

2
Tôi không biết cách chạy mãi mãi - dịch vụ. "Thử nghiệm" trong "thử nghiệm cài đặt dịch vụ mãi mãi" là gì? Lệnh của tôi để khởi động ứng dụng của tôi mãi mãi là: "/ usr / local / bin / mãi bắt đầu -c / usr / local / bin / node / home / alex / public / node_modules / http-server / bin / http-server -s - d sai ". Tôi sẽ phải viết gì?
Alex

3
kiểm tra ở đây là tên của dịch vụ. Khi bạn chạy thử nghiệm cài đặt dịch vụ mãi mãi, nó sẽ tạo ra một dịch vụ gọi là thử nghiệm, để chạy app.js trong thư mục đó để được chạy như một dịch vụ. Tôi sẽ đề nghị đọc tài liệu trợ giúp trên trang gihub và thêm một vấn đề ở đó nếu bạn không thể hiểu nó.
arva

6
@Alex - để làm rõ nhận xét của arva - trong ví dụ forever-service install test, testsẽ là tên của dịch vụ , nhưng không phải là tên của tệp .js chương trình / nút thực tế để chạy. Theo mặc định, nó giả sử tên của chương trình là app.js, nhưng bạn có thể ghi đè lên nó bằng --scriptcờ, như sau : forever-service install test --script main.js. (Chưa được kiểm tra, vì vậy vui lòng sửa cho tôi nếu có bất kỳ chi tiết cú pháp nào sai.)
Dan Nissenbaum

3
@DanNissenbaum Cảm ơn bạn đã trả lời. Tôi hiện đang sử dụng PM2 hoạt động rất đẹp. Hướng dẫn: digitalocean.com/community/tutorials/
Alex

26

Trường hợp này là hợp lệ cho Debian.

Thêm vào đây /etc/rc.local

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

  • {{user}} thay thế tên người dùng của bạn.
  • {{app path}}thay thế đường dẫn ứng dụng của bạn. Ví dụ,/var/www/test/app.js

2
Phương pháp này không giải quyết được việc tắt máy duyên dáng, mặc dù đối với nhiều người thì đây có lẽ không phải là vấn đề.
UpTheCux

6
BTW - Tôi nghĩ bạn nên chỉnh sửa /etc/rc.localchứ không phải/etc/init.d/rc.local
UpTheCalet

Đồng ý với @UpTheCalet rằng /etc/rc.local là nơi thích hợp hơn để thêm phần này - xem: unix.stackexchange.com/a/59945 để được giải thích tuyệt vời.
Vì vậy,

2
Ngoài ra, bạn có thể muốn chỉ định 'thư mục làm việc hiện tại' app.jsđể đảm bảo các tệp tương đối được tải chính xác - process.chdir('/your/path/to/your/app'); tài liệu tham khảo Node.js tại đây
Vì vậy,

1
Nếu bạn cần đặt các biến môi trường cho tập lệnh Node.JS của mình (như $ PORT cho express), hãy thêm dòng sau để /etc/rc.localthực hiện thủ thuật cho tôi:( cd /path/to/project && /usr/bin/sudo -u {{user}} env PORT={{port number}} PATH=$PATH:/usr/local/bin sh -c "forever start app.js" )
sffc

25
  1. Cài đặt PM2 trên toàn cầu bằng NPM

    npm install pm2 -g

  2. Bắt đầu kịch bản của bạn với pm2

    pm2 start app.js

  3. tạo một kịch bản khởi động hoạt động

    pm2 startup

    LƯU Ý: khởi động pm2 là để khởi động PM2 khi hệ thống khởi động lại. PM2 một khi đã bắt đầu, khởi động lại tất cả các quy trình mà nó đã quản lý trước khi hệ thống ngừng hoạt động.

Trong trường hợp bạn muốn tắt tự động khởi động, chỉ cần sử dụng pm2 unstartup

Nếu bạn muốn tập lệnh khởi động được thực thi dưới một người dùng khác, chỉ cần sử dụng -u <username>tùy chọn và--hp <user_home>:


Xin đừng đăng cùng một câu trả lời cho nhiều câu hỏi.
FelixSFD

Tôi thực sự thích cách pm2 được tinh chỉnh và đi kèm với một công cụ giám sát tuyệt vời. Hy vọng điều này được làm nổi bật hơn cho những người khác. @ rv7 Tôi chắc chắn bạn đã thấy điều này, nhưng có một giải pháp windows: npmjs.com/package/pm2-windows-service . Mặc dù vậy, tôi đã không thử nó.
John Lee

11

Một phương pháp thay thế crontab lấy cảm hứng từ đây câu trả lời và này bài đăng blog.

1. Tạo tệp bash script (thay đổi bob thành người dùng mong muốn).

vi /home/bob/node_server_init.sh

2. Sao chép và dán tệp này vào trong tệp bạn vừa tạo.

#!/bin/sh

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

Hãy chắc chắn để chỉnh sửa các đường dẫn ở trên theo cấu hình của bạn!

3. Hãy chắc chắn rằng tập lệnh bash có thể được thực thi.

chmod 700 /home/bob/node_server_init.sh

4. Kiểm tra tập lệnh bash.

sh /home/bob/node_server_init.sh

5. Thay thế "bob" bằng người dùng thời gian chạy cho nút.

crontab -u bob -e

6. Sao chép và dán (thay đổi bob cho người dùng mong muốn).

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

Lưu crontab.

Bạn đã làm cho đến cuối cùng, giải thưởng của bạn là một khởi động lại (để kiểm tra) :)


Phương pháp này làm việc tốt nhất cho tôi. Mãi mãi sẽ thoát ra khi tôi đặt một đường dẫn đầy đủ đến tệp server.js. Nếu tôi chạy nó trong cùng thư mục, foreveer sẽ hoạt động tốt. Lý do thất bại là tệp server.js bao gồm các tệp khác, nhưng các đường dẫn đã bị rối. Sử dụng phương pháp này, tôi có thể CD trong tập lệnh .sh của mình vào thư mục, sau đó chạy mọi thứ liên quan đến đó.
BeardedGeek

9

Trả lời sao chép từ câu hỏi đính kèm .

Bạn có thể sử dụng PM2 , đây là trình quản lý quy trình sản xuất cho các ứng dụng Node.js với bộ cân bằng tải tích hợp.

Cài đặt PM2

$ npm install pm2 -g

Bắt đầu một ứng dụng

$ pm2 start app.js

Nếu bạn sử dụng express thì bạn có thể bắt đầu ứng dụng của mình như

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

Liệt kê tất cả các quy trình đang chạy:

$ pm2 list

Nó sẽ liệt kê tất cả quá trình. Sau đó, bạn có thể dừng / khởi động lại dịch vụ của mình bằng cách sử dụng ID hoặc Tên của ứng dụng bằng lệnh sau.

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

Để hiển thị nhật ký

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

Làm thế nào để nó bắt đầu TỰ ĐỘNG khi khởi động hệ thống? Bạn chỉ cần sao chép / dán thủ công CLI gõ
Green

@Green, Run, $pm2 startupSau đó, bạn sẽ thấy pm2 yêu cầu tự chạy một lệnh, sao chép và chạy lệnh đó. Sau đó, $pm2 saveBây giờ app.js của bạn sẽ tồn tại trong quá trình khởi động lại hệ thống
yajnesh

7

Bạn cần tạo một tập lệnh shell trong thư mục /etc/init.d cho điều đó. Sẽ khá phức tạp nếu bạn chưa bao giờ thực hiện nó nhưng có rất nhiều thông tin trên web về các tập lệnh init.d.

Đây là một tập lệnh mẫu mà tôi đã tạo để chạy một trang CoffeeScript mãi mã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

Tôi phải đảm bảo rằng thư mục và PATH được đặt rõ ràng hoặc có sẵn cho người dùng root vì các tập lệnh init.d được chạy dưới dạng root.


2
Nếu bạn có bất kỳ phụ thuộc nào cũng được bắt đầu với init.d, bạn có thể gặp vấn đề về thứ tự tải.
UpTheCux

@ alexandru.topliceanu Tôi đã sửa liên kết.
Hector Correa

6

Sử dụng PM2

Đó là tùy chọn tốt nhất để chạy máy chủ sản xuất máy chủ

Những lợi thế của việc chạy ứng dụng của bạn theo cách này là gì?

  • PM2 sẽ tự động khởi động lại ứng dụng của bạn nếu nó gặp sự cố.

  • PM2 sẽ giữ một bản ghi các trường hợp ngoại lệ chưa được xử lý của bạn - trong trường hợp này, trong một tệp tại /home/safeuser/.pm2/logs/app-err.log.

  • Với một lệnh, PM2 có thể đảm bảo rằng mọi ứng dụng mà nó quản lý khởi động lại khi máy chủ khởi động lại. Về cơ bản, ứng dụng nút của bạn sẽ bắt đầu như một dịch vụ.

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


5

Mãi mãi không được thực hiện để có được các ứng dụng nút chạy như các dịch vụ. Cách tiếp cận đúng là tạo một mục / etc / inittab (hệ thống linux cũ) hoặc mới bắt đầu (hệ thống linux mới hơn).

Dưới đây là một số tài liệu về cách thiết lập tính năng này như một sự khởi đầu: https://github.com/cvee/node-upstart


Upstart thất bại với tôi trên CentOS và tôi đọc rằng nó sẽ biến mất. Tạo một mục init.d thực sự không phải là cách thân thiện với người dùng nhất, nhưng đó là linux tôi cho rằng :)
Jorre

5

crontabkhông hoạt động với tôi trên CentOS x86 6.5. @reboot dường như không hoạt động.

Cuối cùng tôi đã có giải pháp này:

Biên tập: /etc/rc.local

sudo vi /etc/rc.local

Thêm dòng này vào cuối tập tin. Thay đổi USER_NAMEPATH_TO_PROJECTcủa riêng bạn. NODE_ENV=productioncó nghĩa là ứng dụng chạy trong chế độ sản xuất. Bạn có thể thêm nhiều dòng nếu bạn cần chạy nhiều hơn một ứng dụng node.js.

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

Không được đặt NODE_ENVtrong một dòng riêng biệt, ứng dụng của bạn sẽ vẫn chạy trong chế độ phát triển, vì mãi mãi không nhận được NODE_ENV.

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

Lưu và thoát vi (nhấn ESC : w q return). Bạn có thể thử khởi động lại máy chủ của bạn. Sau khi máy chủ của bạn khởi động lại, ứng dụng node.js của bạn sẽ tự động chạy, ngay cả khi bạn không đăng nhập vào bất kỳ tài khoản nào từ xa thông qua ssh.

Bạn nên thiết lập NODE_ENVmôi trường trong vỏ của bạn. NODE_ENVsẽ được đặt tự động khi tài khoản của bạn USER_NAMEđăng nhập.

echo export NODE_ENV=production >> ~/.bash_profile

Vì vậy, bạn có thể chạy các lệnh như mãi mãi dừng / bắt đầu /PATH_TO_PROJECT/app.jsqua ssh mà không cần thiết lập NODE_ENVlại.


gặp vấn đề tương tự trên debian 7.6. Điều này cố định cho tôi. Cảm ơn nhiều.
Daniele Vrut

Chỉ trong trường hợp bạn không muốn sử dụng 'mãi mãi', bạn có thể thay đổi dòng thành 'su - USER_NAME -c "NODE_ENV = nút sản xuất / PATH_TO_PRO DỰ ÁN / bin / www"'.
yaobin

3

Tôi đã viết một kịch bản thực hiện chính xác điều này:

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

Tôi đã không cố gắng mãi mãi, nhưng bạn có thể tùy chỉnh lệnh mà nó chạy, vì vậy nó sẽ được chuyển thẳng:

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

1

Tôi đã thử rất nhiều câu trả lời ở trên. Không ai trong số họ làm việc cho tôi. Ứng dụng của tôi được cài đặt trong /homevà với tư cách là người dùng, không phải là root. Điều này có thể có nghĩa là khi các kịch bản bắt đầu được đề cập ở trên chạy, /homechưa được gắn kết, vì vậy ứng dụng chưa được khởi động.

Sau đó, tôi tìm thấy các hướng dẫn của Digital Ocean:

https://www.digitalocean.com/community/tutorials/how-to-use-pm2-to-setup-a-node-js-production-en môi-on-an-ub Ubuntu-vps

Sử dụng PM2 như được giải thích là rất đơn giản và hoạt động hoàn hảo: Các máy chủ ảo của tôi gặp hai sự cố vật lý kể từ khi - thời gian chết chỉ khoảng một phút.


PM2 có nhiều sao (2x) trên github hơn là mãi mãi và nó cũng có nhiều tính năng hơn. Tôi nghĩ rằng hầu hết các câu trả lời đã lỗi thời ở đây.
inf3rno

1

Vấn đề với RC.local là các lệnh được truy cập dưới dạng root khác với việc đăng nhập với tư cách người dùng và sử dụng sudo.

Tôi đã giải quyết vấn đề này bằng cách thêm tập lệnh .sh với các lệnh khởi động tôi muốn etc / profile.d. Mọi tệp .sh trong profile.d sẽ tự động tải và mọi lệnh sẽ được xử lý như thể bạn đã sử dụng sudo thông thường.

Nhược điểm duy nhất của việc này là người dùng được chỉ định cần phải đăng nhập cho những thứ để bắt đầu mà trong tình huống của tôi luôn luôn như vậy.


0

hoàn thành ví dụ crontab (nằm ở / etc / crontab) ..

#!/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;

-1

Bạn có thể sử dụng lệnh sau trong shell của mình để bắt đầu nút của mình mãi mãi:

forever app.js //my node script

Bạn cần lưu ý rằng máy chủ mà ứng dụng của bạn đang chạy phải luôn được duy trì.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.