Ubuntu 运行dart服务器的最佳方法?
我有一个用Dart编写的http服务器,我计划将其部署到Linux虚拟机上。现在,我的测试/演示服务器在Ubuntu数字海洋水滴上。有没有人有一个好的init脚本或者比使用linux init服务脚本更好的方法 编辑: 我现在的初始化脚本:Ubuntu 运行dart服务器的最佳方法?,ubuntu,dart,init,Ubuntu,Dart,Init,我有一个用Dart编写的http服务器,我计划将其部署到Linux虚拟机上。现在,我的测试/演示服务器在Ubuntu数字海洋水滴上。有没有人有一个好的init脚本或者比使用linux init服务脚本更好的方法 编辑: 我现在的初始化脚本: #! /bin/sh ### BEGIN INIT INFO # Provides: dart # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs
#! /bin/sh
### BEGIN INIT INFO
# Provides: dart
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Starts Dart
# Description: This will start the dart runtime and in turn, start
### END INIT INFO
# Author: David Marchbanks <ptdave20@gmail.com>
# Do NOT "set -e"
# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Dart Server"
NAME=dart
DAEMON=/usr/bin/$NAME
DART_SERVER=/home/dart/server/bin/server.dart
DAEMON_ARGS="$DART_SERVER"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0
# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME
# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh
# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions
#
# Function that starts the daemon/service
#
do_start()
{
# Return
# 0 if daemon has been started
# 1 if daemon was already running
# 2 if daemon could not be started
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON $DAEMON_ARGS || return 2
# Add code here, if necessary, that waits for the process to be ready
# to handle requests from services started subsequently which depend
# on this one. As a last resort, sleep for some time.
}
#
# Function that stops the daemon/service
#
do_stop()
{
# Return
# 0 if daemon has been stopped
# 1 if daemon was already stopped
# 2 if daemon could not be stopped
# other if a failure occurred
start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
RETVAL="$?"
[ "$RETVAL" = 2 ] && return 2
# Wait for children to finish too if this is a daemon that forks
# and if the daemon is only ever run from this initscript.
# If the above conditions are not satisfied then add some other code
# that waits for the process to drop all resources that could be
# needed by services started subsequently. A last resort is to
# sleep for some time.
start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
[ "$?" = 2 ] && return 2
# Many daemons don't delete their pidfiles when they exit.
rm -f $PIDFILE
return "$RETVAL"
}
#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
#
# If the daemon can reload its configuration without
# restarting (for example, when it is sent a SIGHUP),
# then implement that here.
#
start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
return 0
}
case "$1" in
start)
[ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
do_start
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
do_stop
case "$?" in
0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
esac
;;
status)
status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
;;
#reload|force-reload)
#
# If do_reload() is not implemented then leave this commented out
# and leave 'force-reload' as an alias for 'restart'.
#
#log_daemon_msg "Reloading $DESC" "$NAME"
#do_reload
#log_end_msg $?
#;;
restart|force-reload)
#
# If the "reload" option is implemented then remove the
# 'force-reload' alias
#
log_daemon_msg "Restarting $DESC" "$NAME"
do_stop
case "$?" in
0|1)
do_start
case "$?" in
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Old process is still running
*) log_end_msg 1 ;; # Failed to start
esac
;;
*)
# Failed to stop
log_end_msg 1
;;
esac
;;
*)
#echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
exit 3
;;
esac
:
#/垃圾箱/垃圾箱
###开始初始化信息
#提供:飞镖
#必需的开始:$remote_fs$syslog
#所需停止:$remote_fs$syslog
#默认开始:2 3 4 5
#默认停止:0 1 6
#简短描述:启动Dart
#描述:这将启动dart运行时,然后启动
###结束初始化信息
#作者:David Marchbanks
#不要“设置-e”
#如果路径在mountnfs.sh脚本之后运行,则仅应包括/usr/*路径
路径=/sbin:/usr/sbin:/bin:/usr/bin
DESC=“Dart服务器”
名称=省道
守护进程=/usr/bin/$NAME
DART_SERVER=/home/DART/SERVER/bin/SERVER.DART
DAEMON_ARGS=“$DART_服务器”
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME
#如果未安装程序包,请退出
[-x“$DAEMON”]| |退出0
#读取配置变量文件(如果存在)
[-r/etc/default/$NAME]&&&/etc/default/$NAME
#加载详细设置和其他rcS变量
. /lib/init/vars.sh
#定义LSB log_*函数。
#依赖lsb base(>=3.2-14)确保此文件存在
#进程的状态正在运行。
. /lib/lsb/init函数
#
#启动守护进程/服务的函数
#
你要开始吗
{
#返回
#如果守护进程已启动,则返回0
#1如果守护进程已在运行
#2如果守护进程无法启动
启动停止守护进程--启动--安静--pidfile$pidfile--exec$daemon--测试>/dev/null
启动停止守护进程--启动--安静--pidfile$pidfile--exec$daemon$daemon_ARGS | |返回2
#如有必要,在此处添加等待进程准备就绪的代码
#处理来自随后启动的服务的请求,这些服务依赖于
#在这一次。作为最后的手段,睡一段时间。
}
#
#停止守护进程/服务的函数
#
停止
{
#返回
#如果守护进程已停止,则返回0
#1如果守护进程已停止
#2如果无法停止守护进程
#如果发生故障,则为其他
start-stop守护进程--stop--quiet--retry=TERM/30/KILL/5--pidfile$pidfile--name$name
RETVAL=“$?”
[“$RETVAL”=2]&返回2
#如果这是一个分叉的守护进程,也要等待子进程完成
#如果守护进程只从这个initscript运行。
#如果不满足上述条件,则添加一些其他代码
#等待进程删除所有可能需要的资源
#随后启动的服务所需。最后一种方法是
#睡一会儿。
启动停止守护进程--停止--安静--oknodo--重试=0/30/KILL/5--执行$daemon
[“$?”=2]&返回2
#许多守护进程在退出时不会删除它们的文件。
rm-f$PIDFILE
返回“$RETVAL”
}
#
#向守护进程/服务发送SIGHUP的函数
#
你要重新加载吗{
#
#如果守护进程可以重新加载其配置而无需
#重新启动(例如,当发送SIGHUP时),
#然后在这里实现它。
#
启动-停止守护进程--停止--信号1--安静--pidfile$pidfile--名称$name
返回0
}
案件“$1”
开始)
[“$VERBOSE”!=no]&&log\u daemon\u msg“Starting$DESC”“$NAME”
你要开始吗
中的大小写“$?”
0 | 1)[“$VERBOSE”!=no]&记录消息0;;
2) [“$VERBOSE”!=no]&记录消息1;;
以撒
;;
(停止)
[“$VERBOSE”!=no]&&log\u daemon\u msg“Stopping$DESC”“$NAME”
你停下来吗
中的大小写“$?”
0 | 1)[“$VERBOSE”!=no]&记录消息0;;
2) [“$VERBOSE”!=no]&记录消息1;;
以撒
;;
(状态)
_proc“$DAEMON”“$NAME”和&exit 0的状态| | exit$?
;;
#重新加载(强制重新加载)
#
#如果未实现do_reload(),则将其注释掉
#并将“强制重新加载”保留为“重新启动”的别名。
#
#log_daemon_msg“正在重新加载$DESC”“$NAME”
#你要重新装货吗
#日志\结束\消息$?
#;;
重新启动(强制重新加载)
#
#如果实现了“重新加载”选项,则删除
#“强制重新加载”别名
#
日志\u daemon\u msg“重新启动$DESC”“$NAME”
你停下来吗
中的大小写“$?”
0|1)
你要开始吗
中的大小写“$?”
0)日志结束消息0;;
1) 日志结束消息1;#旧进程仍在运行
*)日志结束消息1;#启动失败
以撒
;;
*)
#未能停止
日志\u结束\u消息1
;;
以撒
;;
*)
#echo“用法:$SCRIPTNAME{start | stop | restart | reload | force reload}>&2
echo“用法:$SCRIPTNAME{start | stop | status | restart | force reload}>&2
出口3
;;
以撒
:
我建议您使用Docker()容器来安装Dart应用程序
下面是一个关于如何“dockerize”Dart应用程序的好例子:
因此,一般来说:
Dockerfile
docker Run…
事实上,它比听起来简单得多,但是统一了流程,所以你可以轻松地在任何“docker友好”的主机上托管你的应用程序,不仅是DigitalOcean,还有Amazon EC2、Google Compute,甚至是Microsoft的Azure 你在寻找类似的东西吗?是的,我现在有一个init脚本,当我观看VM引导时,它会进入服务并挂起。仍然可以远程输入并执行其他操作,但只是挂起。理想情况下,我希望在没有额外安装的情况下尽可能保持服务的简单性/通用性。除了相关问题之外,我还没有看到其他任何东西(这并不意味着因为我在运行服务器方面没有太多经验)。大概