diff --git a/meshcore/agentcore.c b/meshcore/agentcore.c
index 18a934921..6f5ad4a9c 100644
--- a/meshcore/agentcore.c
+++ b/meshcore/agentcore.c
@@ -5479,6 +5479,8 @@ int MeshAgent_AgentMode(MeshAgentHostContainer *agentHost, int paramLen, char **
{
agentHost->openFrameMode = true; parseCommands = 0;
enable_file_logging_simple();
+ // Decorated startup marker parsed by openframe-client
+ openframe_printf("MeshAgent starting (build %s, self-update version %d)\n", SOURCE_COMMIT_DATE, MESH_AGENT_VERSION);
}
if (strcmp(param[ri], "--openframe-secret") == 0 && ((ri + 1) < paramLen))
{
diff --git a/modules/agent-installer.js b/modules/agent-installer.js
index 91580c58b..ba0319dce 100644
--- a/modules/agent-installer.js
+++ b/modules/agent-installer.js
@@ -1146,6 +1146,7 @@ function createLaunchDaemon(serviceName, companyName, installPath, serviceId, in
name: serviceName,
target: 'meshagent',
startType: 'AUTO_START',
+ failureRestart: 0, // auto-start on boot, but do not restart on crash/exit
parameters: ['--serviceId', serviceId],
companyName: companyName
};
@@ -1910,6 +1911,7 @@ function installService(params)
target: target==null?(process.platform == 'win32' ? 'MeshAgent' : 'meshagent'):target,
servicePath: process.execPath,
startType: 'AUTO_START',
+ failureRestart: 0, // auto-start on boot, but do not restart on crash/exit
parameters: params,
_installer: true
};
diff --git a/modules/service-manager.js b/modules/service-manager.js
index a97962b2c..27326c3c9 100644
--- a/modules/service-manager.js
+++ b/modules/service-manager.js
@@ -2977,6 +2977,7 @@ function serviceManager()
var stdoutpath = (options.stdout ? ('StandardOutPath\n' + options.stdout + '') : ('StandardOutPath\n/tmp/' + serviceId + '-daemon.log'));
var stderrpath = (options.stderr ? ('StandardErrorPath\n' + options.stderr + '') : ('StandardErrorPath\n/tmp/' + serviceId + '-daemon.log'));
var autoStart = (options.startType == 'AUTO_START' ? '' : '');
+ var keepAlive = ((options.failureRestart == null || options.failureRestart > 0) ? '' : ''); // launchd restart-on-exit
// Apply OpenFrame parameters formatting for macOS
console.log('[DEBUG service-manager] options.parameters before processing: ' + JSON.stringify(options.parameters));
@@ -3002,7 +3003,7 @@ function serviceManager()
plist += ' Disabled\n';
plist += ' \n';
plist += ' KeepAlive\n';
- plist += ' \n';
+ plist += (' ' + keepAlive + '\n');
plist += ' Label\n';
plist += (' ' + serviceId + '\n');
plist += (params + '\n');