当服务器关闭/崩溃时,Node JS 自动重启所有 JS 进程
Node JS auto restart all forever JS process when server goes down / crashes
我正在使用 forever js 来保持我的节点服务器 运行宁 24/7 在 AWS EC2 上。
我用这个命令
forever start index.js
但是,我注意到有时它会随机停止进程并且我的网站出现故障。我必须通过以下方式手动 ssh 进入我的服务器以再次 运行 它:
forever restartall
然后备份。有什么方法可以定义超时,比方说如果 server/website 在 5 秒内没有响应 200,然后自动重新启动所有永久进程?
我是新手,如果有人能为我的案例提供一步一步的例子,那就太棒了。
所以这是一个使用 cron
到 运行 脚本的示例,可以重新启动 service/perform 一些自动化任务。基本上,我创建了一些我需要在我的服务器上以特定时间间隔 运行 的脚本。对于你的情况,你想制作一个脚本来自动检查你的 forever.js 的状态,如果它 returns 是一个错误的响应,运行 你提到的 forever restartall
命令多于。
您可以通过 creating a new crontab entry 在服务器上进行设置。就脚本而言,我绝不是 bash 脚本大师;我制作了一个适合我的简单脚本。这是一个检查我的机器上的服务的示例,如果它不是 运行ning,则重新启动它。
#!/bin/bash
zabbix_server="service zabbix-server"
zabbix_agent="service zabbix-agent"
logfile=zabbix_auto_restart.log
logfilePath=/etc/scripts/zabbix/$logfile
zabbix_server_running=0
zabbix_agent_running=0
grep_agent (){
local retval=$(ps -ef | grep -v grep | grep zabbix_agentd | wc -l)
echo $retval
}
grep_server (){
local retval=$(ps -ef | grep -v grep | grep zabbix_server | wc -l)
echo $retval
}
check_zabbix_agentd (){
if (( $(grep_agent) <= 0 ))
then
sudo /etc/init.d/zabbix-agent start
echo `date` "$zabbix_agent was stopped... Restarting" >> $logfilePath
echo "************************************************" >> $logfilePath
#Send email to notify that the script ran
echo "$(date) $zabbix_agent was restarted from zabbix_restart.sh" | mutt -s "Zabbix Auto-restart Script Just Ran" <my-email>
else
let zabbix_agent_running=1
fi
}
check_zabbix_server (){
if (( $(grep_server) <= 0 ))
then
sudo /etc/init.d/zabbix-server start
echo `date` "$zabbix_server was stopped... Restarting" >> $logfilePath
echo "************************************************" >> $logfilePath
#Send email to notify that the script ran
echo "$(date) $zabbix_server was restarted from zabbix_restart.sh" | mutt -s "Zabbix Auto-restart Script Just Ran" evan.bechtol@ericsson.com
else
let zabbix_server_running=1
fi
}
main_loop (){
until ((zabbix_server_running == 1 && zabbix_agent_running == 1));
do
check_zabbix_agentd
check_zabbix_server
sleep 1.5
done
}
main_loop
该视频是一个很棒的节点部署系列的一部分,最终在 UNIX 服务器上使用服务...也许它对您有帮助。顺便说一句,这四个视频都值得一看……
Youtube-Link
(NodeJS)服务器不应该无缘无故停止。大多数情况下,是因为未 catch
ed 的 500 错误而停止服务器,然后您将不得不重新启动它。
forever
默认使用 node
来启动您的服务器。
nodemon
是一个 npm 包,可以在代码更改或服务器停止时重新启动服务器。
您可以通过以下操作同时使用 forever
和 nodemon
:
forever start nodemon --exitcrash app.js
或
forever start -c nodemon app.js
或者,按照其他答案中的建议,您可以使用 PM2,这对于生产来说会更好!
想通了。问题是由于我的 EC2 实例中可用的 RAM 较少。我将 RAM 升级到 2 GB,到目前为止还没有遇到崩溃。
Node 也会产生未捕获的异常错误,但我的主要问题是内存不足。
希望这对其他人有帮助。
您是否考虑过将 pm2 作为替代方案。 pm2 有一些非常简洁的功能,例如:
- 运行一个集群
- 正在集群中一个接一个地重启实例(零停机部署)
- 资源监控(显示实时 cpu 和内存使用情况)
- 使用 cli 管理所有 pm2 进程
您还可以通过添加 --restart-delay <delay>
选项来控制重启。
特此完整输出该工具的帮助
pm2 --help
-------------
Looking for a complete monitoring and management tool for PM2?
_ _ _ _
| | _____ _ _ _ __ ___ ___| |_ _ __(_) ___ ___ (_) ___
| |/ / _ \ | | | '_ ` _ \ / _ \ __| '__| |/ __/ __| | |/ _ \
| < __/ |_| | | | | | | __/ |_| | | | (__\__ \_| | (_) |
|_|\_\___|\__, |_| |_| |_|\___|\__|_| |_|\___|___(_)_|\___/
|___/
Features
- Real Time Dashboard
- CPU/Memory monitoring
- HTTP monitoring
- Event notification
- Custom value monitoring
- Real Time log display
Checkout
https://keymetrics.io/
-------------
[PM2] Spawning PM2 daemon
[PM2] PM2 Successfully daemonized
Usage: pm2 [cmd] app
Commands:
start [options] <file|json|stdin|app_name|pm_id...> start and daemonize an app
deploy <file|environment> deploy your json
startOrRestart <json> start or restart JSON file
startOrReload <json> start or gracefully reload JSON file
startOrGracefulReload <json> start or gracefully reload JSON file
stop [options] <id|name|all|json|stdin...> stop a process (to start it again, do pm2 restart <app>)
restart [options] <id|name|all|json|stdin...> restart a process
scale <app_name> <number> scale up/down a process in cluster mode depending on total_number param
reload <name|all> reload processes (note that its for app using HTTP/HTTPS)
gracefulReload <name|all> gracefully reload a process. Send a "shutdown" message to close all connections.
id <name> get process id by name
delete <name|id|script|all|json|stdin...> stop and delete a process from pm2 process list
sendSignal <signal> <pm2_id|name> send a system signal to the target process
ping ping pm2 daemon - if not up it will launch it
updatePM2 update in-memory PM2 with local PM2
update (alias) update in-memory PM2 with local PM2
install|module:install <module|git:/> install or update a module and run it forever
module:update <module|git:/> update a module and run it forever
module:generate [app_name] Generate a sample module in current folder
uninstall|module:uninstall <module> stop and uninstall a module
publish|module:publish Publish the module you are currently on
set <key> <value> sets the specified config <key> <value>
multiset <value> multiset eg "key1 val1 key2 val2
get [key] get value for <key>
conf [key] [value] get / set module config values
config <key> [value] get / set module config values
unset <key> clears the specified config <key>
interact [options] [secret_key|command] [public_key] [machine_name] linking action to keymetrics.io - command can be stop|info|delete|restart
link [options] [secret_key|command] [public_key] [machine_name] linking action to keymetrics.io - command can be stop|info|delete|restart
web launch a health API on port 9615
dump dump all processes for resurrecting them later
save (alias) dump all processes for resurrecting them later
resurrect resurrect previously dumped processes
startup [platform] auto resurrect process at startup. [platform] = ubuntu, centos, redhat, gentoo, systemd, darwin, amazon
logrotate copy default logrotate configuration
generate generate an ecosystem.json configuration file
ecosystem generate an ecosystem.json configuration file
reset <name|id|all> reset counters for process
describe <id> describe all parameters of a process id
desc <id> (alias) describe all parameters of a process id
info <id> (alias) describe all parameters of a process id
show <id> (alias) describe all parameters of a process id
list list all processes
ls (alias) list all processes
l (alias) list all processes
status (alias) list all processes
jlist list all processes in JSON format
prettylist print json in a prettified JSON
monit launch termcaps monitoring
m (alias) launch termcaps monitoring
flush flush logs
reloadLogs reload all logs
logs [options] [id|name] stream logs file. Default stream all logs
kill kill daemon
pull <name> [commit_id] updates repository for a given app
forward <name> updates repository to the next commit for a given app
backward <name> downgrades repository to the previous commit for a given app
gc force PM2 to trigger garbage collection
deepUpdate performs a deep update of PM2
*
Options:
-h, --help output usage information
-V, --version output the version number
-v --version get version
-s --silent hide all messages
-m --mini-list display a compacted list without formatting
-f --force force actions
-n --name <name> set a <name> for script
-i --instances <number> launch [number] instances (for networked app)(load balanced)
-l --log [path] specify entire log file (error and out are both included)
-o --output <path> specify out log file
-e --error <path> specify error log file
-p --pid <pid> specify pid file
-k --kill-timeout <delay> delay before sending final SIGKILL signal to process
--max-memory-restart <memory> specify max memory amount used to autorestart (in megaoctets)
--restart-delay <delay> specify a delay between restarts (in milliseconds)
--env <environment_name> specify environment to get specific env variables (for JSON declaration)
-x --execute-command execute a program using fork system
-u --user <username> define user when generating startup script
--hp <home path> define home path when generating startup script
-c --cron <cron_pattern> restart a running process based on a cron pattern
-w --write write configuration in local folder
--interpreter <interpreter> the interpreter pm2 should use for executing app (bash, python...)
--interpreter-args <arguments> interpret options (alias of --node-args)
--log-date-format <momentjs format> add custom prefix timestamp to logs
--no-daemon run pm2 daemon in the foreground if it doesn't exist already
--skip-env do not refresh environmnent on restart/reload
--source-map-support force source map support
--only <application-name> with json declaration, allow to only act on one application
--disable-source-map-support force source map support
--merge-logs merge logs from different instances but keep error and out separated
--watch [paths] watch application folder for changes
--ignore-watch <folders|files> folder/files to be ignored watching, chould be a specific name or regex - e.g. --ignore-watch="test node_modules "some scripts""
--node-args <node_args> space delimited arguments to pass to node in cluster mode - e.g. --node-args="--debug=7001 --trace-deprecation"
--no-color skip colors
--no-vizion start an app without vizion feature (versioning control)
--no-autorestart start an app without automatic restart
--no-treekill Only kill the main process, not detached children
--no-pmx start an app without pmx
--no-automation start an app without pmx
Basic Examples:
Start an app using all CPUs available + set a name :
$ pm2 start app.js -i 0 --name "api"
Restart the previous app launched, by name :
$ pm2 restart api
Stop the app :
$ pm2 stop api
Restart the app that is stopped :
$ pm2 restart api
Remove the app from the process list :
$ pm2 delete api
Kill daemon pm2 :
$ pm2 kill
Update pm2 :
$ npm install pm2@latest -g ; pm2 update
More examples in https://github.com/Unitech/pm2#usagefeatures
Deployment help:
$ pm2 deploy help
我建议使用 PM2
这是生产服务器上 运行 的最佳选择。
运行以这种方式设置您的应用程序有哪些优势?
- 设置简单,运行。
- 如果应用程序崩溃,PM2 会自动重启。
- PM2 将记录您未处理的异常 - 在这种情况下,在
/home/safeuser/.pm2/logs/app-err.log
. 的文件中
- 通过一个命令,PM2 可以确保它管理的任何应用程序在服务器重新启动时重新启动。基本上意味着您的节点应用程序将作为服务启动。
我正在使用 forever js 来保持我的节点服务器 运行宁 24/7 在 AWS EC2 上。
我用这个命令
forever start index.js
但是,我注意到有时它会随机停止进程并且我的网站出现故障。我必须通过以下方式手动 ssh 进入我的服务器以再次 运行 它:
forever restartall
然后备份。有什么方法可以定义超时,比方说如果 server/website 在 5 秒内没有响应 200,然后自动重新启动所有永久进程?
我是新手,如果有人能为我的案例提供一步一步的例子,那就太棒了。
所以这是一个使用 cron
到 运行 脚本的示例,可以重新启动 service/perform 一些自动化任务。基本上,我创建了一些我需要在我的服务器上以特定时间间隔 运行 的脚本。对于你的情况,你想制作一个脚本来自动检查你的 forever.js 的状态,如果它 returns 是一个错误的响应,运行 你提到的 forever restartall
命令多于。
您可以通过 creating a new crontab entry 在服务器上进行设置。就脚本而言,我绝不是 bash 脚本大师;我制作了一个适合我的简单脚本。这是一个检查我的机器上的服务的示例,如果它不是 运行ning,则重新启动它。
#!/bin/bash
zabbix_server="service zabbix-server"
zabbix_agent="service zabbix-agent"
logfile=zabbix_auto_restart.log
logfilePath=/etc/scripts/zabbix/$logfile
zabbix_server_running=0
zabbix_agent_running=0
grep_agent (){
local retval=$(ps -ef | grep -v grep | grep zabbix_agentd | wc -l)
echo $retval
}
grep_server (){
local retval=$(ps -ef | grep -v grep | grep zabbix_server | wc -l)
echo $retval
}
check_zabbix_agentd (){
if (( $(grep_agent) <= 0 ))
then
sudo /etc/init.d/zabbix-agent start
echo `date` "$zabbix_agent was stopped... Restarting" >> $logfilePath
echo "************************************************" >> $logfilePath
#Send email to notify that the script ran
echo "$(date) $zabbix_agent was restarted from zabbix_restart.sh" | mutt -s "Zabbix Auto-restart Script Just Ran" <my-email>
else
let zabbix_agent_running=1
fi
}
check_zabbix_server (){
if (( $(grep_server) <= 0 ))
then
sudo /etc/init.d/zabbix-server start
echo `date` "$zabbix_server was stopped... Restarting" >> $logfilePath
echo "************************************************" >> $logfilePath
#Send email to notify that the script ran
echo "$(date) $zabbix_server was restarted from zabbix_restart.sh" | mutt -s "Zabbix Auto-restart Script Just Ran" evan.bechtol@ericsson.com
else
let zabbix_server_running=1
fi
}
main_loop (){
until ((zabbix_server_running == 1 && zabbix_agent_running == 1));
do
check_zabbix_agentd
check_zabbix_server
sleep 1.5
done
}
main_loop
该视频是一个很棒的节点部署系列的一部分,最终在 UNIX 服务器上使用服务...也许它对您有帮助。顺便说一句,这四个视频都值得一看…… Youtube-Link
(NodeJS)服务器不应该无缘无故停止。大多数情况下,是因为未 catch
ed 的 500 错误而停止服务器,然后您将不得不重新启动它。
forever
默认使用 node
来启动您的服务器。
nodemon
是一个 npm 包,可以在代码更改或服务器停止时重新启动服务器。
您可以通过以下操作同时使用 forever
和 nodemon
:
forever start nodemon --exitcrash app.js
或
forever start -c nodemon app.js
或者,按照其他答案中的建议,您可以使用 PM2,这对于生产来说会更好!
想通了。问题是由于我的 EC2 实例中可用的 RAM 较少。我将 RAM 升级到 2 GB,到目前为止还没有遇到崩溃。
Node 也会产生未捕获的异常错误,但我的主要问题是内存不足。
希望这对其他人有帮助。
您是否考虑过将 pm2 作为替代方案。 pm2 有一些非常简洁的功能,例如:
- 运行一个集群
- 正在集群中一个接一个地重启实例(零停机部署)
- 资源监控(显示实时 cpu 和内存使用情况)
- 使用 cli 管理所有 pm2 进程
您还可以通过添加 --restart-delay <delay>
选项来控制重启。
特此完整输出该工具的帮助
pm2 --help
-------------
Looking for a complete monitoring and management tool for PM2?
_ _ _ _
| | _____ _ _ _ __ ___ ___| |_ _ __(_) ___ ___ (_) ___
| |/ / _ \ | | | '_ ` _ \ / _ \ __| '__| |/ __/ __| | |/ _ \
| < __/ |_| | | | | | | __/ |_| | | | (__\__ \_| | (_) |
|_|\_\___|\__, |_| |_| |_|\___|\__|_| |_|\___|___(_)_|\___/
|___/
Features
- Real Time Dashboard
- CPU/Memory monitoring
- HTTP monitoring
- Event notification
- Custom value monitoring
- Real Time log display
Checkout
https://keymetrics.io/
-------------
[PM2] Spawning PM2 daemon
[PM2] PM2 Successfully daemonized
Usage: pm2 [cmd] app
Commands:
start [options] <file|json|stdin|app_name|pm_id...> start and daemonize an app
deploy <file|environment> deploy your json
startOrRestart <json> start or restart JSON file
startOrReload <json> start or gracefully reload JSON file
startOrGracefulReload <json> start or gracefully reload JSON file
stop [options] <id|name|all|json|stdin...> stop a process (to start it again, do pm2 restart <app>)
restart [options] <id|name|all|json|stdin...> restart a process
scale <app_name> <number> scale up/down a process in cluster mode depending on total_number param
reload <name|all> reload processes (note that its for app using HTTP/HTTPS)
gracefulReload <name|all> gracefully reload a process. Send a "shutdown" message to close all connections.
id <name> get process id by name
delete <name|id|script|all|json|stdin...> stop and delete a process from pm2 process list
sendSignal <signal> <pm2_id|name> send a system signal to the target process
ping ping pm2 daemon - if not up it will launch it
updatePM2 update in-memory PM2 with local PM2
update (alias) update in-memory PM2 with local PM2
install|module:install <module|git:/> install or update a module and run it forever
module:update <module|git:/> update a module and run it forever
module:generate [app_name] Generate a sample module in current folder
uninstall|module:uninstall <module> stop and uninstall a module
publish|module:publish Publish the module you are currently on
set <key> <value> sets the specified config <key> <value>
multiset <value> multiset eg "key1 val1 key2 val2
get [key] get value for <key>
conf [key] [value] get / set module config values
config <key> [value] get / set module config values
unset <key> clears the specified config <key>
interact [options] [secret_key|command] [public_key] [machine_name] linking action to keymetrics.io - command can be stop|info|delete|restart
link [options] [secret_key|command] [public_key] [machine_name] linking action to keymetrics.io - command can be stop|info|delete|restart
web launch a health API on port 9615
dump dump all processes for resurrecting them later
save (alias) dump all processes for resurrecting them later
resurrect resurrect previously dumped processes
startup [platform] auto resurrect process at startup. [platform] = ubuntu, centos, redhat, gentoo, systemd, darwin, amazon
logrotate copy default logrotate configuration
generate generate an ecosystem.json configuration file
ecosystem generate an ecosystem.json configuration file
reset <name|id|all> reset counters for process
describe <id> describe all parameters of a process id
desc <id> (alias) describe all parameters of a process id
info <id> (alias) describe all parameters of a process id
show <id> (alias) describe all parameters of a process id
list list all processes
ls (alias) list all processes
l (alias) list all processes
status (alias) list all processes
jlist list all processes in JSON format
prettylist print json in a prettified JSON
monit launch termcaps monitoring
m (alias) launch termcaps monitoring
flush flush logs
reloadLogs reload all logs
logs [options] [id|name] stream logs file. Default stream all logs
kill kill daemon
pull <name> [commit_id] updates repository for a given app
forward <name> updates repository to the next commit for a given app
backward <name> downgrades repository to the previous commit for a given app
gc force PM2 to trigger garbage collection
deepUpdate performs a deep update of PM2
*
Options:
-h, --help output usage information
-V, --version output the version number
-v --version get version
-s --silent hide all messages
-m --mini-list display a compacted list without formatting
-f --force force actions
-n --name <name> set a <name> for script
-i --instances <number> launch [number] instances (for networked app)(load balanced)
-l --log [path] specify entire log file (error and out are both included)
-o --output <path> specify out log file
-e --error <path> specify error log file
-p --pid <pid> specify pid file
-k --kill-timeout <delay> delay before sending final SIGKILL signal to process
--max-memory-restart <memory> specify max memory amount used to autorestart (in megaoctets)
--restart-delay <delay> specify a delay between restarts (in milliseconds)
--env <environment_name> specify environment to get specific env variables (for JSON declaration)
-x --execute-command execute a program using fork system
-u --user <username> define user when generating startup script
--hp <home path> define home path when generating startup script
-c --cron <cron_pattern> restart a running process based on a cron pattern
-w --write write configuration in local folder
--interpreter <interpreter> the interpreter pm2 should use for executing app (bash, python...)
--interpreter-args <arguments> interpret options (alias of --node-args)
--log-date-format <momentjs format> add custom prefix timestamp to logs
--no-daemon run pm2 daemon in the foreground if it doesn't exist already
--skip-env do not refresh environmnent on restart/reload
--source-map-support force source map support
--only <application-name> with json declaration, allow to only act on one application
--disable-source-map-support force source map support
--merge-logs merge logs from different instances but keep error and out separated
--watch [paths] watch application folder for changes
--ignore-watch <folders|files> folder/files to be ignored watching, chould be a specific name or regex - e.g. --ignore-watch="test node_modules "some scripts""
--node-args <node_args> space delimited arguments to pass to node in cluster mode - e.g. --node-args="--debug=7001 --trace-deprecation"
--no-color skip colors
--no-vizion start an app without vizion feature (versioning control)
--no-autorestart start an app without automatic restart
--no-treekill Only kill the main process, not detached children
--no-pmx start an app without pmx
--no-automation start an app without pmx
Basic Examples:
Start an app using all CPUs available + set a name :
$ pm2 start app.js -i 0 --name "api"
Restart the previous app launched, by name :
$ pm2 restart api
Stop the app :
$ pm2 stop api
Restart the app that is stopped :
$ pm2 restart api
Remove the app from the process list :
$ pm2 delete api
Kill daemon pm2 :
$ pm2 kill
Update pm2 :
$ npm install pm2@latest -g ; pm2 update
More examples in https://github.com/Unitech/pm2#usagefeatures
Deployment help:
$ pm2 deploy help
我建议使用 PM2
这是生产服务器上 运行 的最佳选择。
运行以这种方式设置您的应用程序有哪些优势?
- 设置简单,运行。
- 如果应用程序崩溃,PM2 会自动重启。
- PM2 将记录您未处理的异常 - 在这种情况下,在
/home/safeuser/.pm2/logs/app-err.log
. 的文件中
- 通过一个命令,PM2 可以确保它管理的任何应用程序在服务器重新启动时重新启动。基本上意味着您的节点应用程序将作为服务启动。