41 lines
2.3 KiB
PowerShell
41 lines
2.3 KiB
PowerShell
[CmdletBinding()]
|
|||
|
|
param([string]$InstallRoot = (Split-Path -Parent $PSScriptRoot), [string]$JavaHome)
|
||
|
|
. (Join-Path $PSScriptRoot 'Common.ps1')
|
||
|
|
$root = [System.IO.Path]::GetFullPath($InstallRoot)
|
||
|
|
$processFile = Join-Path $root 'service-process.json'
|
||
|
|
$deployment = Get-Content -LiteralPath (Join-Path $root 'deployment.json') -Raw | ConvertFrom-Json
|
||
|
|
if (Test-Path -LiteralPath $processFile) {
|
||
|
|
$record = Get-Content -LiteralPath $processFile -Raw | ConvertFrom-Json
|
||
|
|
if (Get-XtrhOwnedProcess -InstallRoot $root -Record $record) {
|
||
|
|
Write-Output '本部署实例已在运行。'
|
||
|
|
return
|
||
|
|
}
|
||
|
|
}
|
||
|
|
$java = Get-XtrhJava -JavaHome $JavaHome
|
||
|
|
$jar = Join-Path $root 'xtrh-services.jar'
|
||
|
|
if (-not (Test-Path -LiteralPath $jar)) { throw '未找到部署 JAR。' }
|
||
|
|
$arguments = @('-Djava.awt.headless=true', '-jar', ('"' + $jar + '"'), '--spring.config.additional-location=file:./config/service.local.properties')
|
||
|
|
$process = Start-Process -FilePath $java -ArgumentList $arguments -WorkingDirectory $root -WindowStyle Hidden -PassThru `
|
||
|
|
-RedirectStandardOutput (Join-Path $root 'logs/stdout.log') -RedirectStandardError (Join-Path $root 'logs/stderr.log')
|
||
|
|
$record = @{pid = $process.Id; startTicks = $process.StartTime.ToUniversalTime().Ticks.ToString(); javaPath = $java; jarPath = $jar}
|
||
|
|
Write-XtrhText -Path $processFile -Content ($record | ConvertTo-Json)
|
||
|
|
$ready = $false
|
||
|
|
$deadline = [DateTime]::UtcNow.AddSeconds(40)
|
||
|
|
while ([DateTime]::UtcNow -lt $deadline) {
|
||
|
|
$process.Refresh()
|
||
|
|
if ($process.HasExited) { break }
|
||
|
|
try {
|
||
|
|
$health = Invoke-RestMethod -Uri ('http://127.0.0.1:' + $deployment.port + '/health') -TimeoutSec 1
|
||
|
|
$identityFile = Join-Path $root 'data/identity.txt'
|
||
|
|
if ((Test-Path -LiteralPath $identityFile) -and $health.service -eq 'xtrh-services' -and $health.role -eq $deployment.role -and
|
||
|
|
$health.serviceId -eq (Get-Content -LiteralPath $identityFile -Raw).Trim()) { $ready = $true; break }
|
||
|
|
} catch { }
|
||
|
|
Start-Sleep -Milliseconds 500
|
||
|
|
}
|
||
|
|
if (-not $ready) {
|
||
|
|
$owned = Get-XtrhOwnedProcess -InstallRoot $root -Record $record
|
||
|
|
if ($owned) { Stop-Process -Id $owned.Id -Force }
|
||
|
|
throw ('服务未通过启动校验;请查看 ' + (Join-Path $root 'logs'))
|
||
|
|
}
|
||
|
|
Write-Output ('服务已启动并通过身份校验:' + $deployment.role + ',端口 ' + $deployment.port)
|