Я пытаюсь запустить службу Windows из сценария узла. Эта служба имеет плохую привычку зависать и иногда требует повторного запуска для успешного запуска. У меня есть обещание настроить цикл while (пожалуйста, предложите лучший способ). Проблема, с которой я столкнулся, заключается в том, что с каждым циклом вывод sc.pollInterval
записывает повторяющиеся результаты в консоль. Ниже приведен пример дублированного контента, который я вижу в консоли, это после второй итерации в цикле, я бы хотел, чтобы он отображал этот контент только один раз.
sc \\abnf34873 start ColdFusion 10 Application Server
sc \\abnf34873 queryex ColdFusion 10 Application Server
SERVICE_NAME: ColdFusion 10 Application Server
TYPE : 10 WIN32_OWN_PROCESS
STATE : 2 START_PENDING
(NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x7d0
PID : 0
FLAGS :
SERVICE_NAME: ColdFusion 10 Application Server
TYPE : 10 WIN32_OWN_PROCESS
STATE : 2 START_PENDING
(NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x7d0
PID : 13772
FLAGS :
Вот код, который у меня есть. В принципе, я попробую запустить сервис 3 раза. Если нет, то выкидываю и ошибаюсь. Следует отметить, что когда я пытаюсь запустить службу, но она застряла в состоянии «Start_pending», я завершаю процесс, а затем пытаюсь запустить его снова.
var retryCount = 0;
// Start the colfusion service
gulp.task('start-coldfusion-service', function(done) {
var serviceStarted = false;
console.log("Starting coldfusion service..");
// This says we're going to ask where it's at every 30 seconds until it's in the desired state.
sc.pollInterval(30);
sc.timeout(60);
retryCount = 0;
tryServiceStart().then(function(result) {
// process final result here
done();
}).catch(function(err) {
// process error here
});
});
function tryServiceStart() {
return startService().then(function(serviceStarted) {
if (serviceStarted == false) {
console.log("Retry Count: " + retryCount);
// Try again..
return tryServiceStart();
} else {
return result;
}
});
}
function startService() {
return new Promise(function(resolve, reject) {
var started = true;
// Make sure the coldfusion service exists on the target server
sc.query(targetServer, { name: 'ColdFusion 10 Application Server'}).done(function(services) {
// if the service exists and it is currentl stopped, then we're going to start it.
if (services.length == 1) {
var pid = services[0].pid;
if (services[0].state.name == 'STOPPED') {
sc.start(targetServer, 'ColdFusion 10 Application Server')
.catch(function(error) {
started = false;
console.log("Problem starting Coldfusion service! error message: " + error.message);
console.log("retrying...");
retryCount++;
if (parseInt(retryCount) > 2) {
throw Error(error.message);
}
})
.done(function(displayName) {
if (started) {
console.log('Coldfusion service started successfully!');
}
resolve(started);
});
} else if (services[0].state.name == 'START_PENDING') {
kill(pid, {force: true}).catch(function (err) {
console.log('Problem killing process..');
}).then(function() {
console.log('Killed hanging process..');
resolve(false);
});
}
} else {
console.log("Could not find the service in a stopped state.");
resolve(false);
}
});
});
}
.done()
и.catch()
. Далеко не ясно, обладает ли.done()
всей мощью правильного.then()
или.done()
- всего лишь отстой, как.done()
jQuery. Примеры предполагают последнее, и я не нашел в Интернете ничего, что говорило бы мне об обратном. - person Roamer-1888   schedule 18.01.2018.done()
в JQuery, поскольку все, что находится внутри, выполняется каждый раз, независимо от того, отклонено ли обещание или выполнено. В любом случае, я нашел решение, которое мне нравится использовать пакет Promise-retry. Я скоро отправлю новый код в качестве ответа. - person Jmh2013   schedule 18.01.2018