Làm cách nào để chạy ứng dụng node.js làm dịch vụ nền?


503

Vì bài đăng này đã nhận được rất nhiều sự chú ý trong những năm qua, tôi đã liệt kê các giải pháp hàng đầu cho mỗi nền tảng ở cuối bài đăng này.


Bài gốc :

Tôi muốn máy chủ node.js của tôi chạy trong nền, tức là: khi tôi đóng thiết bị đầu cuối của mình, tôi muốn máy chủ của mình tiếp tục chạy. Tôi đã googled điều này và đưa ra hướng dẫn này , tuy nhiên nó không hoạt động như dự định. Vì vậy, thay vì sử dụng tập lệnh daemon đó, tôi nghĩ rằng tôi chỉ sử dụng chuyển hướng đầu ra ( 2>&1 >> filephần), nhưng điều này cũng không thoát - tôi nhận được một dòng trống trong thiết bị đầu cuối của mình, giống như nó đang chờ đầu ra / lỗi.

Tôi cũng đã cố gắng đặt quá trình vào nền, nhưng ngay sau khi tôi đóng thiết bị đầu cuối của mình, quá trình cũng bị giết.

Vì vậy, làm thế nào tôi có thể để nó chạy khi tôi tắt máy tính cục bộ của tôi?


Giải pháp hàng đầu :


3
Tôi nghĩ anh ta có ý định đóng cửa hệ thống địa phương của mình
Kamal Reddy

46
ông có nghĩa là đóng một phiên ssh chấm dứt nhiệm vụ
thedjaney

5
github.com/Unitech/pm2 là trình quản lý quy trình được duy trì cao và rất ổn định, hãy dùng thử!
Unitech

1
bạn có thể sử dụng màn hình ( aperiodic.net/screen/quick_reference )
karantan

Câu trả lời:


434

Sao chép câu trả lời của riêng tôi từ Làm cách nào để chạy ứng dụng Node.js làm quy trình riêng?

Câu trả lời năm 2015 : gần như mọi bản phân phối Linux đều đi kèm với systemd, có nghĩa là mãi mãi, monit, PM2, v.v. không còn cần thiết nữa - HĐH của bạn đã xử lý các tác vụ này .

Tạo một myapp.servicetệp (rõ ràng thay thế 'myapp' bằng tên ứng dụng của bạn):

[Unit]
Description=My app

[Service]
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
# Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody'
Group=nogroup
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp

[Install]
WantedBy=multi-user.target

Lưu ý nếu bạn chưa quen với Unix: /var/www/myapp/app.js nên có #!/usr/bin/env nodengay dòng đầu tiên.

Sao chép tập tin dịch vụ của bạn vào /etc/systemd/system.

Bắt đầu với systemctl start myapp.

Cho phép nó chạy khi khởi động với systemctl enable myapp.

Xem nhật ký với journalctl -u myapp

Điều này được lấy từ Cách chúng tôi triển khai các ứng dụng nút trên Linux, phiên bản 2018 , cũng bao gồm các lệnh để tạo AWS / DigitalOcean / Azure CloudConfig để xây dựng máy chủ Linux / nút (bao gồm cả .servicetệp).


4
Upstart, khi có sẵn cũng là một giải pháp tốt. dù bằng cách nào, bạn không nên dựa vào quá trình nodejs để giữ cho trình nền của nodejs của bạn chạy. Đây chỉ là một nhiệm vụ cho HĐH. killall nodejs và mãi mãi biến mất ....
131

19
Lưu ý rằng cũng có thể chạy các dịch vụ systemd như một người dùng. Xem ví dụ hướng dẫn này . Bạn có thể đặt tệp dịch vụ của mình vào ~/.config/systemd/user, khởi động nó systemctl --user start myapp, kích hoạt nó với systemctl --user enable myapp.
cdauth

5
Cảm ơn câu trả lời này. Đây là những gì tôi muốn tinh khiết và rõ ràng
bmavus

5
Tôi đã chấp nhận câu trả lời này thay vì câu trả lời "mãi mãi", vì tôi cũng nghĩ rằng đây là cách tốt nhất để làm điều đó. Có những câu trả lời tương tự cho Mac & Windows, nhưng tôi đoán phần lớn đang tìm kiếm một giải pháp Linux.
Peter Kruithof

11
trong đường dẫn EC2 AMI / etc / systemd / system không tồn tại. Bạn có thể chỉ ra đường dẫn chính xác trong AWS EC2 Linux AMI là gì không?
René Michel

241

Bạn có thể sử dụng Mãi mãi, Công cụ CLI đơn giản để đảm bảo rằng tập lệnh nút đã cho chạy liên tục (tức là mãi mãi): https://www.npmjs.org/package/forver


4
Với nút mới nhất, tôi không thể khiến ứng dụng dừng ứng dụng thông qua tên tập lệnh (lỗi) - cũng vậy - nói chung là hoạt động sai (trên OS-X) - tất cả được xây dựng từ nguồn, thật kỳ lạ. Những thứ còn lại trong tình trạng tồi tệ, không làm tôi tự tin.
Michael Neale

4
Trong khi nohup thực hiện thủ thuật, mãi mãi là một giải pháp tốt hơn vì nó tạo điều kiện cho quá trình. Công cụ tuyệt vời!
Peter Kruithof

5
Nhân tiện, một hướng dẫn đơn giản hơn có sẵn ở đây: Giữ máy chủ node.js với Mãi mãi
kehers

2
Tôi đã sử dụng Mãi mãi một lúc, lúc đầu mọi thứ có vẻ ổn nhưng rồi tai họa đã xảy ra. Mãi mãi không thể quản lý các quy trình nữa và để chúng chạy hoang dã. Vẫn đang vật lộn để tìm một giải pháp tốt hơn. Tôi sẽ cố gắng sử dụng nohup
LN

5
Geoffrey- không, bạn sẽ cần phải thực hiện forever start /path/to/yourApp.jstrong tập lệnh khởi động máy chủ của mình.
mikermcneil

215

CẬP NHẬT - Như đã đề cập trong một trong những câu trả lời dưới đây, PM2 có một số chức năng thực sự tốt đẹp bị thiếu mãi mãi. Cân nhắc sử dụng nó.

Câu trả lời gốc

Sử dụng nohup :

nohup node server.js &

EDIT Tôi muốn thêm rằng câu trả lời được chấp nhận thực sự là con đường để đi. Tôi đang sử dụng mãi mãi trong những trường hợp cần ở lại. Tôi thích làm npm install -g forevernhư vậy trong đường dẫn nút và sau đó chỉ cần làmforever start server.js


136
phần thú vị cần biết: nohuplà viết tắt của no hanguptừ ngày xưa, nơi bạn muốn bạn giữ một quy trình sống khi bạn "gác máy" modem của mình.
jAndy

1
ngày nay, đúng hơn là tên của tín hiệu 1 mà các quá trình nhận được để cảnh báo rằng người dùng đã đóng vỏ (hoặc mất kết nối modem, tất nhiên: P)
lapo

7
Đây không phải là giải pháp tốt nhất vì nếu ứng dụng gặp lỗi chưa xử lý, quy trình nút sẽ thoát và không khởi động lại. Tuy nhiên, đó là một lựa chọn hợp lý để phát triển.
Andy E

1
Làm thế nào tôi có thể thêm các biến môi trường vào đó? ví dụ: PORT = 80 nút server.js
Pardoner

1
Kiểm tra câu trả lời này từ SO - stackoverflow.com/questions/8825460/ từ
NG.

67

Đây có thể không phải là cách được chấp nhận, nhưng tôi làm điều đó với màn hình, đặc biệt là trong khi đang phát triển vì tôi có thể đưa nó trở lại và đánh lừa nó nếu cần thiết.

screen
node myserver.js
>>CTRL-A then hit D

Màn hình sẽ tách ra và tồn tại khi bạn đăng xuất. Sau đó, bạn có thể lấy lại màn hình -r. Nhấn lên màn hình hướng dẫn để biết thêm chi tiết. Bạn có thể đặt tên cho màn hình và không có gì nếu bạn thích.


2
Ngoài ra, tmux là tốt đẹp. Hoạt động như màn hình (CTRL-B là mặc định thay vì CTRL-A, nhưng có thể định cấu hình). Tmux có bảng điều khiển (màn hình chia nhỏ).
snapfractalpop

1
màn hình cũng có bảng điều khiển
Billy Moon

Tôi đang sử dụng điều này từ vài tuần cho một ứng dụng sao băng. '$ screen -dr' để tách rời và gắn lại đôi khi có thể được yêu cầu.
Vinay Vemula

Đối với tôi cách dễ nhất để hoàn thành công việc. Nhưng tôi đồng ý, không phải là giải pháp tốt nhất
Pomme De Terre

Giải pháp này không tồn tại sau khi khởi động lại hệ thống
wnasich

60

Cập nhật 2016: Chuỗi nút-windows / mac / linux sử dụng API chung trên tất cả các hệ điều hành, vì vậy đây hoàn toàn là một giải pháp phù hợp. Tuy nhiên; node-linux tạo tập tin init systemv. Khi systemd tiếp tục phát triển phổ biến, thực tế đây là một lựa chọn tốt hơn trên Linux. Chào mừng bạn nếu ai đó muốn thêm hỗ trợ systemd cho nút-linux :-)

Chủ đề gốc:

Đây là một chủ đề khá cũ bây giờ, nhưng các nút cửa sổ cung cấp một cách khác để tạo các dịch vụ nền trên Windows. Nó dựa trên nssmkhái niệm sử dụng một exetrình bao bọc xung quanh tập lệnh nút của bạn. Tuy nhiên; winsw.exethay vào đó, nó sử dụng và cung cấp một trình bao bọc nút có thể cấu hình để kiểm soát chi tiết hơn về cách quá trình bắt đầu / dừng khi gặp sự cố. Các quy trình này có sẵn như bất kỳ dịch vụ nào khác:

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

Các mô-đun cũng bakes trong một số ghi nhật ký sự kiện:

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

Daemonizing kịch bản của bạn được thực hiện thông qua mã. Ví dụ:

var Service = require('node-windows').Service;

// Create a new service object
var svc = new Service({
  name:'Hello World',
  description: 'The nodejs.org example web server.',
  script: 'C:\\path\\to\\my\\node\\script.js'
});

// Listen for the "install" event, which indicates the
// process is available as a service.
svc.on('install',function(){
  svc.start();
});

// Listen for the "start" event and let us know when the
// process has actually started working.
svc.on('start',function(){
  console.log(svc.name+' started!\nVisit http://127.0.0.1:3000 to see it in action.');
});

// Install the script as a service.
svc.install();

Mô-đun hỗ trợ những thứ như giới hạn khởi động lại (vì vậy các tập lệnh xấu không làm hỏng máy chủ của bạn) và khoảng thời gian tăng dần giữa các lần khởi động lại.

Vì các dịch vụ nút-windows chạy như mọi dịch vụ khác, nên có thể quản lý / giám sát dịch vụ với bất kỳ phần mềm nào bạn đã sử dụng.

Cuối cùng, không có makesự phụ thuộc. Nói cách khác, một cách đơn giảnnpm install -g node-windows sẽ làm việc. Bạn không cần Visual Studio, .NET hoặc ma thuật nút-gyp để cài đặt cái này. Ngoài ra, đó là MIT và BSD được cấp phép.

Trong tiết lộ đầy đủ, tôi là tác giả của mô-đun này. Nó được thiết kế để giảm bớt nỗi đau chính xác mà OP đã trải qua, nhưng với sự tích hợp chặt chẽ hơn vào chức năng mà Hệ điều hành đã cung cấp. Tôi hy vọng những người xem trong tương lai với câu hỏi tương tự sẽ thấy nó hữu ích.


8
Bây giờ tôi đã chuyển cái này sang nút-mac , cung cấp chức năng tương tự trên OSX.
Corey

1
Tôi đã đi đến điểm để lên lịch cho một vài chương trình Node và đứng trước quyết định chọn nút-windows, Mãi mãi hoặc Kue. Tôi nghiêng về phía các cửa sổ nút nhưng muốn hiểu tại sao không sử dụng Mãi mãi hoặc Kue khi tôi muốn lên lịch và theo dõi hàng tá chương trình nút. Một số chạy mãi. Cần theo dõi quá.
Christiaan Westerbeek

5
Node-windows sử dụng HĐH gốc để quản lý các dịch vụ nền và nhật ký sự kiện riêng để ghi nhật ký. Mãi mãi có theo dõi và đăng nhập tùy chỉnh của riêng mình. Tôi đã viết một bài viết về điều này tại Medium.com/p/2a602ea657a2 Có vẻ như bạn cần lên lịch cho các tập lệnh của mình chứ không phải chạy chúng mọi lúc như các dịch vụ nền. Các dự án như Kue và Agenda được thiết kế cho việc này. Node-windows & Mãi mãi phục vụ một mục đích khác.
Corey

1
@Corey, làm thế nào để tôi chạy ví dụ được bao gồm trong nút-mac ?, Từ thiết bị đầu cuối, tôi đã thử nút install.js, nhưng dường như nó không nhận được helloworld.js
Edwin Ikechukwu Okonkwo

@Edwin - Có thể tốt nhất để mở một câu hỏi mới với nhiều chi tiết hơn về vấn đề, bao gồm cả mã bạn đang sử dụng.
Corey

28

CẬP NHẬT : tôi đã cập nhật để bao gồm mới nhất từ ​​pm2:

đối với nhiều trường hợp sử dụng, sử dụng dịch vụ systemd là cách đơn giản và phù hợp nhất để quản lý quy trình nút. Đối với những người đang chạy nhiều quy trình nút hoặc microservice nút chạy độc lập trong một môi trường duy nhất, pm2 là một công cụ đầy đủ tính năng hơn.

https://github.com/unitech/pm2

http://pm2.io

  • nó có một tính năng giám sát thực sự hữu ích -> khá 'gui' để giám sát dòng lệnh của nhiều quy trình với pm2 monithoặc danh sách quy trình vớipm2 list
  • Quản lý nhật ký có tổ chức -> pm2 logs
  • những thứ khác:
    • Cấu hình hành vi
    • Hỗ trợ bản đồ nguồn
    • Tương thích PaaS
    • Xem và tải lại
    • Hệ thống mô-đun
    • Tải lại bộ nhớ tối đa
    • Chế độ cụm
    • Tải lại nóng
    • Quy trình phát triển
    • Tập lệnh khởi động
    • Tự động hoàn thành
    • Quy trình triển khai
    • Giám sát chính
    • API

20

Nếu bạn chỉ đơn giản muốn chạy tập lệnh không bị gián đoạn cho đến khi hoàn thành, bạn có thể sử dụng nohupnhư đã được đề cập trong các câu trả lời ở đây. Tuy nhiên, không có câu trả lời nào cung cấp một lệnh đầy đủ cũng ghi nhật ký stdinstdout.

nohup node index.js >> app.log 2>&1 &
  • Các >>phương tiện nối vào app.log.
  • 2>&1đảm bảo rằng các lỗi cũng được gửi đến stdoutvà thêm vào app.log.
  • Kết thúc &đảm bảo thiết bị đầu cuối hiện tại của bạn bị ngắt kết nối khỏi lệnh để bạn có thể tiếp tục làm việc.

Nếu bạn muốn chạy một máy chủ nút (hoặc một cái gì đó sẽ khởi động lại khi máy chủ khởi động lại), bạn nên sử dụng systemd / systemctl .


1
câu trả lời hay nhất m8.
bholagabbar

1
giải thích độc đáo
Prakhar Prakash Bhardwaj

19

Nếu bạn đang chạy OSX, thì cách dễ nhất để tạo ra một quy trình hệ thống thực sự là sử dụng launchd để khởi chạy nó.

Xây dựng một plist như thế này và đặt nó vào / Library / LaunchDaemons với tên top-level-domain.your-domain.application.plist(bạn cần phải root khi đặt nó):

<?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>top-level-domain.your-domain.application</string>

    <key>WorkingDirectory</key>
    <string>/your/preferred/workingdirectory</string>

    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/node</string>
        <string>your-script-file</string>
    </array>

    <key>RunAtLoad</key>
    <true/>

    <key>KeepAlive</key>
    <true/>

</dict>
</plist>

Khi hoàn tất, hãy phát hành cái này (với quyền root):

launchctl load /Library/LaunchDaemons/top-level-domain.your-domain.application.plist
launchctl start top-level-domain.your-domain.application

và bạn đang chạy

Và bạn vẫn sẽ chạy sau khi khởi động lại.

Đối với các tùy chọn khác trong danh sách, hãy xem trang con người ở đây: https://developer.apple.com/l Library / mac / documentation / Darwin / Reference / Manpages / man5 / launchd.plist.5.html


Người dùng này sẽ chạy dịch vụ như thế nào? Có cách nào để thiết lập người dùng?
rjmunro

15

Hãy thử chạy lệnh này nếu bạn đang sử dụng nohup -

nohup npm start 2>/dev/null 1>/dev/null&

Bạn cũng có thể sử dụng mãi mãi để khởi động máy chủ

forever start -c "npm start" ./ 

PM2 cũng hỗ trợ npm start

pm2 start npm -- start

2
thnx, điều này làm việc hoàn hảo. pm2 start npm -- start
yadavr

13

Tôi chỉ đơn giản là sử dụng mô-đun daemon npm:

var daemon = require('daemon');

daemon.daemonize({
    stdout: './log.log'
  , stderr: './log.error.log'
  }
, './node.pid'
, function (err, pid) {
  if (err) {
    console.log('Error starting daemon: \n', err);
    return process.exit(-1);
  }
  console.log('Daemonized successfully with pid: ' + pid);

  // Your Application Code goes here
});

Gần đây tôi cũng đang sử dụng mon (1) từ TJ Holowaychuk để bắt đầu và quản lý các ứng dụng nút đơn giản.


12

Tôi sử dụng Giám sát để phát triển. Nó chỉ hoạt động. Khi bạn thay đổi tệp .js, Trình giám sát sẽ tự động khởi động lại ứng dụng của bạn với những thay đổi được tải.

Đây là một liên kết đến trang Github của nó

Tải về :

sudo npm cài đặt giám sát -g

Bạn có thể dễ dàng làm cho nó xem các phần mở rộng khác với -e. Một lệnh khác tôi thường sử dụng là -i để bỏ qua các thư mục nhất định.

Bạn có thể sử dụng nohup và người giám sát để làm cho ứng dụng nút của bạn chạy trong nền ngay cả sau khi bạn đăng xuất.

sudo nohup giám sát viên myapp.js &


1
Tôi nghĩ rằng giám sát viên thực tế là một lựa chọn tốt hơn so với hầu hết các mô-đun daemon, đặc biệt được sử dụng cùng với một webhook để kiểm tra cập nhật.
Iain Collins

Tôi thứ hai này. Nếu bạn thay đổi tệp PHP, bạn sẽ khởi động lại máy chủ Apache hoặc Nginx? Chắc chắn không phải. Vậy thì tại sao phải khởi động lại toàn bộ máy chủ Node.js thậm chí chỉ thay đổi một dòng mã? Mặc dù đây có thể không phải là giải pháp tốt nhất, nhưng khi thuê với Người giám sát, bạn không cần phải lo lắng về quá trình khởi động lại (thực tế việc khởi động lại vẫn xảy ra).
Zhang Buzz

7

Node.js làm dịch vụ nền trong WINDOWS XP

Cài đặt:

  1. Cài đặt WGET http://gnuwin32.sourceforge.net/packages/wget.htm thông qua trình cài đặt thực thi
  2. Cài đặt GIT http://code.google.com.vn/p/msysgit/doads/list thông qua trình cài đặt thực thi
  3. Cài đặt NSSM http://nssm.cc/doad/?page=doad bằng cách sao chép nnsm.exe vào thư mục% Windir% / system32
  4. Tạo c: \ node \ helloworld.js

    // http://howtonode.org/hello-node
    var http = require('http');
    var server = http.createServer(function (request, response) {
        response.writeHead(200, {"Content-Type": "text/plain"});
        response.end("Hello World\n");
    });
    server.listen(8000);
    console.log("Server running at http://127.0.0.1:8000/");
  5. Mở bảng điều khiển lệnh và gõ như sau (chỉ setx nếu Bộ tài nguyên được cài đặt)

    C:\node> set path=%PATH%;%CD%
    C:\node> setx path "%PATH%"
    C:\node> set NODE_PATH="C:\Program Files\nodejs\node_modules"
    C:\node> git config --system http.sslcainfo /bin/curl-ca-bundle.crt    
    C:\node> git clone --recursive git://github.com/isaacs/npm.git    
    C:\node> cd npm    
    C:\node\npm> node cli.js install npm -gf   
    C:\node> cd ..    
    C:\node> nssm.exe install node-helloworld "C:\Program Files\nodejs\node.exe" c:\node\helloworld.js    
    C:\node> net start node-helloworld
  6. Một ưu điểm hàng loạt tiện lợi là tạo c: \ node \ ServiceMe.cmd

    @echo off
    nssm.exe install node-%~n1 "C:\Program Files\nodejs\node.exe" %~s1
    net start node-%~n1
    pause

Quản lý dịch vụ:

  • Bản thân các dịch vụ hiện có thể truy cập thông qua Start-> Run-> services.msc hoặc qua Start-> Run-> MSCONFIG-> Services (và kiểm tra 'Hide All Microsoft Services').
  • Tập lệnh sẽ tiền tố mọi nút được thực hiện thông qua tập lệnh bó với 'nút-'.
  • Tương tự như vậy, chúng có thể được tìm thấy trong sổ đăng ký: " HKLM \ HỆ THỐNG \ CurrentControlset \ Services \ node-xxxx "

7

Câu trả lời được chấp nhận có lẽ là câu trả lời sản xuất tốt nhất, nhưng để hack nhanh làm công việc dev, tôi đã tìm thấy điều này:

nodejs scriptname.js & không hoạt động, bởi vì nodejs dường như đã ngấu nghiến &, và vì vậy điều đó không cho phép tôi tiếp tục sử dụng thiết bị đầu cuối mà không có scriptname.js sắp chết.

Nhưng tôi đã đặt nodejs scriptname.jsmột tập tin .sh và nohup sh startscriptname.sh &làm việc.

Chắc chắn không phải là một điều sản xuất, nhưng nó giải quyết vấn đề "Tôi cần tiếp tục sử dụng thiết bị đầu cuối của mình và không muốn bắt đầu 5 thiết bị đầu cuối khác nhau".


4

Nếu bạn đang chạy nodejs trong máy chủ linux, tôi nghĩ đây là cách tốt nhất.

Tạo tập lệnh dịch vụ và sao chép vào /etc/init/nodejs.conf

dịch vụ bắt đầu: sudo dịch vụ nodejs bắt đầu

dừng dịch vụ: sudo dịch vụ nodejs dừng

Kịch bản dịch vụ

description "DManager node.js server - Last Update: 2012-08-06"
author      "Pedro Muniz - pedro.muniz@geeklab.com.br"

env USER="nodejs" #you have to create this user 
env APPNAME="nodejs" #you can change the service name
env WORKDIR="/home/<project-home-dir>" #set your project home folder here
env COMMAND="/usr/bin/node <server name>" #app.js ?

# used to be: start on startup
# until we found some mounts weren't ready yet while booting:
start on started mountall
stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

pre-start script
    sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/$APPNAME.log
end script

script
    # Not sure why $HOME is needed, but we found that it is:
    export HOME="<project-home-dir>"  #set your project home folder here
    export NODE_PATH="<project node_path>"

    #log file, grant permission to nodejs user
    exec start-stop-daemon --start --make-pidfile --pidfile /var/run/$APPNAME.pid --chuid $USER --chdir $WORKDIR --exec $COMMAND >> /var/log/$APPNAME.log 2>&1
end script

post-start script
   # Optionally put a script here that will notifiy you node has (re)started
   # /root/bin/hoptoad.sh "node.js has started!"
end script

pre-stop script
    sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/$APPNAME.log
end script

4

Cập nhật tháng 6 năm 2017:
Giải pháp cho Linux: (Mũ đỏ). Nhận xét trước đây không làm việc cho tôi. Điều này hoạt động với tôi trên Amazon Web Service - Red Hat 7. Hy vọng điều này hiệu quả với ai đó ngoài kia.

A. Create the service file 
sudo vi /etc/systemd/system/myapp.service
[Unit]
Description=Your app
After=network.target

[Service]
ExecStart=/home/ec2-user/meantodos/start.sh
WorkingDirectory=/home/ec2-user/meantodos/

[Install]
WantedBy=multi-user.target

B. Create a shell file
/home/ec2-root/meantodos/start.sh
#!/bin/sh -
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
npm start

then:
chmod +rx /home/ec2-root/meantodos/start.sh
(to make this file executable)

C. Execute the Following

sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl status myapp

(If there are no errors, execute below.  Autorun after server restarted.)
chkconfig myapp -add

Rất thú vị, tôi chỉ tò mò về iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080những gì nó làm. Bạn có thể cho tôi biết thêm chi tiết xin vui lòng. Tôi không chắc chắn nhưng tôi nghĩ rằng nó chuyển hướng giao thông từ 80để 8080mà nút máy chủ lắng nghe, phải không?
Shakiba Moshiri

3

sử dụng nssm giải pháp tốt nhất cho windows, chỉ cần tải xuống nssm , mở cmd vào thư mục nssm và gõ

nssm install <service name> <node path> <app.js path> 

eg: nssm install myservice "C:\Program Files\nodejs" "C:\myapp\app.js" 

điều này sẽ cài đặt một dịch vụ windows mới sẽ được liệt kê tại services.msc từ đó bạn có thể bắt đầu hoặc dừng dịch vụ, dịch vụ này sẽ tự động khởi động và bạn có thể định cấu hình để khởi động lại nếu thất bại.


2

Để làm tròn các tùy chọn khác nhau được đề xuất, đây là một trong số đó: daemonlệnh trong GNU / Linux, mà bạn có thể đọc về đây: http://libslack.org/daemon/manpages/daemon.1.html . (xin lỗi nếu điều này đã được đề cập trong một trong những ý kiến ​​trên).



1

có ai nhận thấy một sai lầm tầm thường của vị trí "2> & 1" không?

2>&1 >> file

nên là

>> file 2>&1

1

Tôi sử dụng tmux cho môi trường phát triển nhiều cửa sổ / khung trên các máy chủ từ xa. Thật đơn giản để tách và giữ cho quá trình chạy trong nền. Có một cái nhìn tại tmux


1

Đối với những người sử dụng các phiên bản mới hơn của mô-đun nemon daemon - bạn cần chuyển các mô tả tệp thay vì chuỗi:

var fs = require('fs');
var stdoutFd = fs.openSync('output.log', 'a');
var stderrFd = fs.openSync('errors.log', 'a');
require('daemon')({
    stdout: stdoutFd, 
    stderr: stderrFd
});

0

PM2 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. Nó cho phép bạn giữ các ứng dụng tồn tại mãi mãi, để tải lại chúng mà không có thời gian chết và tạo điều kiện cho các tác vụ quản trị hệ thống phổ biến. https://github.com/Unitech/pm2


vấn đề tiêu thụ bộ nhớ nghiêm trọng! đi tìm phusion + nginx
Rizwan Patel

0

Tôi ngạc nhiên khi không ai nhắc đến Guvnor

Tôi đã cố gắng mãi mãi, pm2, v.v. Nhưng, khi nói đến kiểm soát chặt chẽ và số liệu hiệu suất dựa trên web, tôi đã tìm thấy Guvnor là tốt nhất. Thêm vào đó, nó cũng là nguồn mở hoàn toàn.

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

Chỉnh sửa: Tuy nhiên, tôi không chắc nếu nó hoạt động trên windows. Tôi chỉ sử dụng nó trên linux.


4
Có vẻ cũ kỹ vào năm 2017. Xây dựng thất bại. Không có mã đẩy trong năm ngoái. Nghi vấn.
azatar

0

Vì tôi thiếu tùy chọn này trong danh sách các câu trả lời được cung cấp, tôi muốn thêm tùy chọn đủ điều kiện kể từ năm 2020: docker hoặc bất kỳ container tương đương nào nền tảng . Ngoài việc đảm bảo ứng dụng của bạn hoạt động trong môi trường ổn định, còn có các lợi ích bảo mật bổ sung cũng như tính di động được cải thiện.

Có hỗ trợ docker cho Windows, macOS và hầu hết / các bản phân phối Linux chính. Việc cài đặt docker trên một nền tảng được hỗ trợ khá đơn giản và được ghi chép đầy đủ. Thiết lập ứng dụng Node.js cũng đơn giản như đặt nó vào một thùng chứa và chạy thùng chứa đó trong khi đảm bảo rằng nó được khởi động lại sau khi tắt máy.

Tạo hình ảnh container

Giả sử ứng dụng của bạn có sẵn trong / home / me / my-app trên máy chủ đó, hãy tạo một tệp văn bản Dockerfile trong thư mục / home / me / my-app có nội dung tương tự như ứng dụng này:

FROM node:lts-alpine
COPY /my-app /app
CMD ["/app/server.js"]

Tạo hình ảnh bằng cách sử dụng lệnh như thế này:

docker build -t myapp-as-a-service /home/me

Lưu ý: Tham số cuối cùng là chọn thư mục chứa Dockerfile đó thay vì chính Dockerfile. Bạn có thể chọn một cái khác bằng cách sử dụng tùy chọn -f .

Bắt đầu container

Sử dụng lệnh này để bắt đầu container:

docker run -d --restart always -p 80:3000 myapp-as-a-service

Lệnh này giả sử ứng dụng của bạn đang nghe trên cổng 3000 và bạn muốn nó được hiển thị trên cổng 80 của máy chủ của bạn.

Đây là một ví dụ rất hạn chế, nhưng nó là một điểm khởi đầu tốt.


0

Nếu bạn đang sử dụng pm2, bạn có thể sử dụng nó với autorestartthiết lập false:

hệ sinh thái $ pm2

Điều này sẽ tạo ra một mẫu ecosystem.config.js:

module.exports = {
  apps: [
    {
      script: './scripts/companies.js',
      autorestart: false,
    },
    {
      script: './scripts/domains.js',
      autorestart: false,
    },
    {
      script: './scripts/technologies.js',
      autorestart: false,
    },
  ],
}

$ pm2 bắt đầu hệ sinh thái.config.js


-1

Câu trả lời này khá muộn cho bữa tiệc, nhưng tôi thấy rằng giải pháp tốt nhất là viết một kịch bản shell sử dụng cả lệnh screen -dmSnohuplệnh.

screen -dmS newScreenName nohup node myserver.js >> logfile.log

Tôi cũng thêm >> logfilebit vào cuối để tôi có thể dễ dàng lưu các console.log()câu lệnh nút .

Tại sao tôi sử dụng tập lệnh shell? Vâng, tôi cũng đã thêm vào một câu lệnh if đã kiểm tra xem liệu node myserver.jstiến trình đã chạy chưa.

Bằng cách đó, tôi đã có thể tạo một tùy chọn dòng lệnh duy nhất cho phép tôi giữ máy chủ hoạt động và cũng khởi động lại nó khi tôi đã thực hiện các thay đổi, rất hữu ích cho việc phát triển.


2
Tôi đã gặp phải vấn đề này và còn khá mới đối với Linux. Làm thế nào bạn sẽ làm điều đó mà không có màn hình hoặc nohup?
Craig Norton
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.