为Azure虚拟机

时间:2015-06-01 12:58:27

标签: powershell azure azure-virtual-machine startupscript azure-automation

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

但是,如何在VM重启后重启节点应用程序?

我们尝试了很多方法来实现这一点,包括添加任务计划程序,向注册表项添加命令(LocalMachine\..\Run),为VM使用自定义脚本扩展...

以上都失败了。我们想要的是在VM重启后,节点应用程序可以自动启动。如果我们使用预定义帐户远程访问VM,则上述某些方法可以正常工作。但是,这不是风景,我们只想在开始时只进行一次远程,而不是每次重启。

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

1 个答案:

答案 0 :(得分: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

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