2

我们正在Azure虚拟机中运行节点应用程序,同时我们还希望在Azure自动化(或通过管理门户)的帮助下的特定时间重新启动VM。运行Azure虚拟机启动任务的正确方式

但是如何在虚拟机重启后重启节点应用?

我们尝试了很多的方法来实现这一目标,包括添加任务计划,命令添加到注册表项(LocalMachine\..\Run),使用自定义脚本扩展为虚拟机...

上述所有失败。我们想要的是在VM重启后,节点应用程序可以自动启动。如果我们使用预定义帐户远程访问虚拟机,上述方法中的一部分可以工作。但是,这不是风景,我们只想在开始时只远程一次,不是每次重启。

那么,在没有手动登录的情况下VM自动重新启动后启动进程或执行命令的正确方法是什么?

+0

[Auto start node.js server on boot]可能重复(http://stackoverflow.com/questions/20445599/auto-start-node-js-server-on-boot) –

+0

@BrunoFaria好的,我会稍后再试一试。但是,由于它不是Azure虚拟机的目标,我认为我的问题更多与Azure Windows VM相关。 –

+0

这看起来像是Windows服务的工作。你看过这个项目吗? https://github.com/coreybutler/node-windows –

回答

1

我已经尝试了很多方法来实现这个目标,从我的角度来看,Task Scheduler是做这种工作的最佳选择。

关键点是永远不要让Windows命令提示符在启动进程后存在。例如,我们首先使用forever来启动节点应用程序。由于forever命令很快返回,这意味着所有的命令执行完成。因此,Windows命令提示符进程将被终止并与节点进程一起。

我们所做的是,我们使用另一种方式永久启动(forever-monitor),它在代码中使用。通过这样做,我们可以简单地使用node命令来启动这个永久启动文件。由于node命令将阻止命令提示符,节点应用程序不会再被终止。


另一种方法是使用Azure Automation远程运行启动脚本。

完整的脚本,可以发现here,关键的一点是:

$PSCommandResult = Invoke-command -AsJob -ConnectionUri $Using:Uri.AbsoluteUri -credential $Using:mycreds -ScriptBlock { Invoke-Expression "D:\start.ps1" } 

start.ps1脚本,我们也不应该退出执行,我们可以用它Start-Sleep命令来实现这一目标。脚本可以是:

forever start --sourceDir D: start.js 
Start-Sleep -s 86400 

希望这两种方法可以帮助你。

相关问题