Làm cách nào để làm cho ứng dụng node.js chạy vĩnh viễn?


259

Trên máy chủ Debian, tôi đã cài đặt Node.js. Tôi hiểu cách khởi chạy một ứng dụng từ putty với dòng lệnh này:

node /srv/www/MyUserAccount/server/server.js

và nhận được nó trên địa chỉ 50.51.52.53:8080(IP và cổng).

Nhưng ngay sau khi tôi đóng putty, sau đó tôi không thể đến địa chỉ 50.51.52.53:8080nữa.

Làm cách nào để ứng dụng Node.js chạy vĩnh viễn?

Như bạn có thể đoán, tôi là người mới bắt đầu với Linux và Node.js.


7
Lưu ý rằng pm2 là một thay thế tốt cho Mãi mãi , nếu bạn không muốn sử dụng Mãi mãi vì bất kỳ lý do gì.
Kevin B

cảm ơn @KevinB github.com/Unitech/pm2 thực sự là sự thay thế tốt
Sachin Chavan

Câu trả lời:


220

Mặc dù các câu trả lời khác giải quyết vấn đề của OP, nhưng tất cả đều quá mức cần thiết và không giải thích lý do tại sao anh ấy hoặc cô ấy gặp phải vấn đề này.

Chìa khóa là dòng này, "Tôi đóng putty, sau đó tôi không thể đến địa chỉ"

Khi bạn đăng nhập vào máy chủ từ xa trên Putty, bạn đã bắt đầu quy trình SSH linux và tất cả các lệnh được nhập từ phiên SSH đó sẽ được thực thi như là con của quy trình đã nói.

Vấn đề của bạn là khi bạn đóng Putty, bạn sẽ thoát phiên SSH để giết quá trình đó và bất kỳ quy trình con đang hoạt động nào. Khi bạn đóng putty, bạn vô tình giết chết máy chủ của mình vì bạn đã chạy nó ở phía trước . Để tránh hành vi này chạy máy chủ trong nền bằng cách nối thêm & vào lệnh của bạn:

node /srv/www/MyUserAccount/server/server.js &

Vấn đề ở đây là thiếu kiến ​​thức linux và không phải là câu hỏi về nút. Để biết thêm thông tin, hãy xem: http://linuxconfig.org/under Hiểu-forground-and-background-linux- Processes

CẬP NHẬT:

Như những người khác đã đề cập, máy chủ nút vẫn có thể chết khi thoát khỏi thiết bị đầu cuối. Một vấn đề phổ biến mà tôi đã gặp là mặc dù quá trình nút đang chạy trong bg, nhưng thiết bị xuất chuẩn và thiết bị xuất chuẩn vẫn được chỉ vào thiết bị đầu cuối. Điều này có nghĩa là nếu máy chủ nút ghi vào console.log hoặc console.error thì nó sẽ bị lỗi đường ống và sự cố. Điều này có thể tránh được bằng cách dẫn đầu ra của quy trình của bạn:

node /srv/www/MyUserAccount/server/server.js > stdout.txt 2> stderr.txt &

Nếu vấn đề vẫn còn thì bạn nên xem xét những thứ như tmux hoặc nohup , vẫn mạnh hơn các giải pháp cụ thể của nút, bởi vì chúng có thể được sử dụng để chạy tất cả các loại quy trình (cơ sở dữ liệu, dịch vụ ghi nhật ký, ngôn ngữ khác).

Một lỗi phổ biến có thể khiến máy chủ thoát ra là sau khi chạy, nohup node your_path/server.js &bạn chỉ cần đóng terminal Putty bằng một cú nhấp chuột đơn giản. Bạn nên sử dụng exitlệnh thay thế, sau đó máy chủ nút của bạn sẽ hoạt động.


7
Nếu bạn vẫn đóng Phiên Putty trong khi thực hiện &dịch vụ vẫn đóng. (Mới thử nghiệm trên Debian Jesse)
NiCk Newman

1
Như @NiCkNewman đã nói, câu trả lời này chưa đầy đủ! Xem câu trả lời của Rick Roy cho giải pháp chính xác.
thejonwithnoh

19
"&" Làm cho quá trình chạy ở chế độ nền nhưng bạn thực sự sẽ cần thêm "nohup" vào đầu lệnh này để tách nó ra khỏi cửa sổ giao diện điều khiển để ứng dụng không dừng khi cửa sổ chuyển sang chế độ ngủ sau một vài lần giờ, sửa đổi lệnh được đề cập trước đó thành:nohup node /srv/www/MyUserAccount/server/server.js &
SirRodge

2
Hệ thống năng lượng AIX, nohup node myApp.js &đã chạy ứng dụng trong bg nhưng nó chết khi thời hạn được đóng lại. Không chắc chắn tại sao mặc dù.
AnBisw

4
@Annjawn, bạn phải sử dụng exitlệnh để thoát khỏi thiết bị đầu cuối.
Iovy Necula

342

Bạn có thể cài đặt mãi mãi bằng cách sử dụng npm như thế này:

sudo npm install -g forever

Và sau đó bắt đầu ứng dụng của bạn với:

forever server.js

Hoặc như một dịch vụ:

forever start server.js

Mãi mãi khởi động lại ứng dụng của bạn khi nó gặp sự cố hoặc dừng lại vì một số lý do. Để hạn chế khởi động lại đến 5 bạn có thể sử dụng:

forever -m5 server.js

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

forever list

Lưu ý số nguyên trong ngoặc và sử dụng nó như sau để dừng quá trình:

forever stop 0

Khởi động lại một quy trình đang chạy:

forever restart 0

Nếu bạn đang làm việc trên tệp ứng dụng của mình, bạn có thể sử dụng -wtham số để tự động khởi động lại bất cứ khi nàoserver.js tệp thay đổi:

forever -w server.js

11
@MarthaJames nếu nó đóng khi phiên ssh / cửa sổ của bạn đóng, thì có khả năng bạn đã quên bao gồm "bắt đầu" trongforever start <file>
Kristian

8
Sự khác biệt giữa sử dụng forever server.jsvà là forever start server.jsgì? Tôi biết nó nói rằng "như một dịch vụ" nhưng điều đó có nghĩa là gì?
Marquizzo

5
Khi tôi gõ vào forever server.js, nó khởi động máy chủ. Nếu tôi nhấn Ctrl+ C, thì nó dừng dịch vụ. Nếu tôi nhập forever start server.jsthì nó khởi động dịch vụ và ngay cả khi tôi nhấn Ctrl+ Cnó vẫn mở. Sau đó, bạn có thể thực hiện các lệnh được tham chiếu khác ở trên để dừng / xem danh sách. Đó là những gì tôi đã trải nghiệm ít nhất.
Termato

6
Điều này có khởi động tập lệnh sau khi máy chủ khởi động lại không?
Beingalex

1
Các forevermô-đun (v0.15.3) là dễ bị tổn thương để Regular Expression Denial of Service attacks và không nên được sử dụng: github.com/foreverjs/forever/issues/960
Benny Neugebauer

82

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]

1
Chúa phù hộ bạn! nó hoạt động !! Công việc mãi mãi và nohup doesnt trên máy chủ dịch vụ web amazon BitNami nodejs ( docs.bitnami.com/aws/infrastructure/nodejs ). PM2 hoạt động rất tốt!
Polras

Thư viện này dường như có số lượng bắt đầu cao nhất trên github
DragonFire

41

Tôi khuyên bạn nên tìm kiếm một cái gì đó như Mãi mãi để khởi động lại Node trong trường hợp xảy ra sự cố và xử lý việc này cho bạn.


Tôi muốn chỉ ra rằng không có nohup, nút sẽ thoát khi bạn thoát phiên ssh nếu bạn chạy theo cách này (trừ khi bạn đang sử dụng một cái gì đó như màn hình để tmux).
Haozhun

1
@Haozhun, Thú vị, nhưng đó không phải là cách nó hoạt động với tôi trên máy của tôi. Khi tôi ssh in và bắt đầu một cái gì đó bằng lệnh này, nó sẽ chạy mãi mãi trong nền, ngay cả sau khi đóng phiên SSH.
Brad

@Brad Vui lòng xem câu trả lời thứ 2 trên stackoverflow.com/questions/4018154/ . Nó xuất hiện khá nhiều người đồng ý với nhận xét đầu tiên của câu hỏi đó giải thích nohup. Sẽ thật tuyệt nếu chúng ta có thể giải quyết sự nhầm lẫn này. Nhưng tôi không biết bắt đầu từ đâu.
Haozhun

4
Đối với hầu hết unixen (bao gồm hầu hết các bản phân phối của Linux), chạy mọi thứ trong nền vẫn sẽ giết quá trình nếu bạn đóng cửa sổ terminal. Để ngăn chặn điều này chạy nó với nohup. Ví dụ:nohup node app.js &
slebetman

1
Tôi sử dụng Mãi mãi với một sản phẩm Linux env. Tôi thường sử dụng lệnh mãi mãi bắt đầu --minUptime 10000 -o /logs/myapp.log nodeApp.js
mbokil

36

Nếu bạn chỉ muốn chạy ứng dụng nút của mình trong thiết bị đầu cuối luôn, chỉ cần sử dụng màn hình.

Cài đặt trên Ubuntu / debian:

sudo apt-get install screen

Sử dụng:

$ screen
$ node /path/to/app.js

ctrl + avà sau đó ctrl + dđể loại bỏ

Để có được trở lại:

Một màn hình: screen -r

Nếu có nhiều hơn một, bạn có thể liệt kê tất cả các màn hình với: screen -ls

Và sau đó: screen -r pid_number


1
Đây là một lựa chọn tốt vì nó cũng cho phép tôi chuyển quá trình sang tiền cảnh bất cứ lúc nào
aexl 22/03/2016

26

Bạn chỉ có thể sử dụng này

nohup node /srv/www/MyUserAccount/server/server.js &

Điều này sẽ giữ cho ứng dụng chạy và để tắt nó, bạn sẽ phải giết nó.

Cho rằng bạn có thể cài đặt htopvà sau đó tìm kiếm nút và sau đó giết nó


18
Điều quan trọng cần lưu ý là trong trường hợp này, người dùng sẽ cần thoát khỏi phiên PuTTY đúng cách (tức là thông qua exitlệnh). Nếu người dùng chỉ cần đóng cửa sổ, điều này có thể sử dụng tín hiệu khác hơn là SIGHUPkết thúc quá trình, và do đó nút sẽ tắt máy.
thejonwithnoh

1
+1 vì là một giải pháp Linux đơn giản cho mọi vấn đề. Điều này tốt hơn câu trả lời của DogNibbler .
thejonwithnoh

@thejonwithnoh sau khi đọc bình luận của bạn, tôi đã cố gắng đóng cửa putty đột ngột nhưng máy chủ vẫn hoạt động, có lẽ nó phải làm gì với cách env được cấu hình. Nhưng tôi đã tìm ra những gì OP yêu cầu, đây sẽ là cách đơn giản nhất để đạt được nó
Rick Roy

Tôi thích cách tiếp cận đơn giản này, đó là cách tôi đang sử dụng, vì để giết nó, cách dễ nhất chỉ là một killall node, nó sẽ giết tất cả các quy trình nút, trong trường hợp của tôi chỉ có một.
Nelson

@Nelson Điều đó sẽ giết tất cả các quy trình nút nếu bạn có nhiều tập lệnh đang chạy và chỉ muốn chấm dứt một quy trình cụ thể, tôi sẽ đề nghị bạn tìm quy trình và sau đó chấm dứt quy trình cụ thể đó chỉ trong trường hợp bạn có nhiều quy trình nút chạy trong máy chủ sản xuất và không muốn cảm thấy như gặp ác mộng: D
Rick Roy

12

Mãi mãi là một mô-đun NodeJs rất tốt để làm chính xác điều đó.

Cài đặt foreverbằng cách gõ vào dòng lệnh

$ npm install forever -g

Sau đó sử dụng lệnh sau để chạy tập lệnh node.js

$ forever start /path/to/script.js

Bạn tốt để đi. Ngoài ra, bạn có thể chạy

$ forever list

để xem tất cả các tập lệnh đang chạy. Bạn có thể chấm dứt bất kỳ tập lệnh cụ thể bằng cách gõ

$ forever stop [pid]

nơi [pid]là quá trình ID của kịch bản, bạn sẽ có được từ listlệnh. Để dừng tất cả các tập lệnh, bạn có thể gõ

$ forever stopall

10

nohup làm việc tôi đã kiểm tra trong AWS Ubunto vm làm theo đúngsyntax

ubuntu@ip-172-00-00-00:~/ms$ nohup node server.js &

sau đó nhấn enter bạn sẽ thấy dòng này

ubuntu@ip-172-00-00-00:~/ms$ nohup: ignoring input and appending output to nohup.out

sau đó gõ cái này

rm nohup.out

nhập mô tả hình ảnh ở đây


3
Tôi thích cách bạn xóa tên máy chủ trong dấu nhắc bash nhỏ, nhưng để lại nó trong tiêu đề lớn của cửa sổ
Conny

10

Cài đặt

$ [sudo] npm install forever -g

Bạn có thể sử dụng mãi mãi để chạy tập lệnh liên tục

forever start server.js

forever list

cho dịch vụ dừng

forever stop server.js

9

Đây là một giải pháp mới nhất mà tôi đang sử dụng cho các dự án cá nhân của mình:

Đặt nó vào /etc/init/node_app_daemon.conf:

description "Node.js Daemon"
author      "Adam Eberlin"

stop on shutdown

respawn
respawn limit 3 15

script
  export APP_HOME="/srv/www/MyUserAccount/server"
  cd $APP_HOME
  exec sudo -u user /usr/bin/node server.js
end script

Điều này cũng sẽ xử lý ứng dụng của bạn trong trường hợp nó gặp sự cố. Nó sẽ từ bỏ các nỗ lực để hồi sinh ứng dụng của bạn nếu nó gặp sự cố 3 lần trở lên trong vòng chưa đầy 15 giây.


9

Trong quá trình phát triển, tôi khuyên bạn nên sử dụng gật đầu . Nó sẽ khởi động lại máy chủ của bạn bất cứ khi nào một tập tin thay đổi. Như những người khác đã chỉ ra, Mãi mãi là một lựa chọn nhưng trong sản xuất, tất cả phụ thuộc vào nền tảng bạn đang sử dụng. Thông thường, bạn sẽ muốn sử dụng cách duy trì dịch vụ được đề xuất của hệ điều hành (ví dụ: http://www.freedesktop.org/wiki/Software/systemd/ ).


Điều này hoạt động với tôi trên ứng dụng MEAN.JS - nodemonchạy lệnh grunt trừ khi bạn chỉ định tệp JS của máy chủ, vì vậy tôi đang sử dụng điều này để chạy mongo và nút mãi mãi / đồng thời
J-Dizzle

8

Tôi đã tìm thấy mãi mãi để làm công việc hoàn toàn tốt.

Giả sử bạn đã cài đặt npm, nếu không, chỉ cần làm

sudo apt-get install npm

Sau đó cài đặt mãi mãi

npm install forever --global

Bây giờ bạn có thể chạy nó như thế này

forever start app.js

https://codingweb.io/run-nodejs-application-background/


npm rm -g mãi mãi để xóa nó
DragonFire

6

Đầu tiên cài đặt pm2 trên toàn cầu

npm install -g pm2

Sau đó bắt đầu

pm2 start bin/www 

5

Một cách khác là tạo một đơn vị hệ thống cho ứng dụng của bạn. tạo tệp "XXX.service" trong thư mục "/ etc / systemd / system", tương tự như sau:

[Unit]
Description=swagger
After=network.target

[Service]
ExecStart=/usr/bin/http-server /home/swagger/swagger-editor &
WorkingDirectory=/home/swagger
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target

Một lợi ích là ứng dụng sẽ chạy như một dịch vụ, nó sẽ tự động khởi động lại nếu nó bị sập.

Bạn cũng có thể sử dụng sytemctl để quản lý nó:

systemctl start XXXđể khởi động dịch vụ, systemctl stop XXXdừng dịch vụ và systemctl enable XXXtự động khởi động ứng dụng khi hệ thống khởi động.


4

Tôi hy vọng điều này sẽ giúp bạn.

Tại dòng lệnh, cài đặt mãi mãi:

npm install forever -g

Tạo một tệp ví dụ:

sudo nano server.js 

Bạn có thể chỉnh sửa tệp và nhận kết quả trực tiếp trong trình duyệt của mình.
Bạn có thể sử dụng filezilla hoặc bất kỳ trình chỉnh sửa nào để chỉnh sửa tệp. Chạy lệnh này để chạy tệp:

forever start --minUptime 1 --spinSleepTime 1000 -w server.js

nhập mô tả hình ảnh ở đây


4

Không cần phải cài đặt bất kỳ gói nào khác.

Chạy lệnh này

node server.js > stdout.txt 2> stderr.txt &

server.js là tệp máy chủ của bạn hoặc nó có thể là api.js

Sau đó nhấn " exit " để đóng terminal

exit


0

Gói mãi mãi làm việc cho tôi, chỉ một điều, nó phụ thuộc vào mức độ sâu bằng nhau , vì vậy nếu bạn gặp vấn đề với việc cài đặt nó như:

npm -g install forever

Thử:

npm -g install forever deep-equal@1.1.1

thay thế.

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.