Spawn / exe c узла не работает при вызове из запланированной задачи Windows - PullRequest
0 голосов
/ 07 января 2020

Я сталкиваюсь с очень странной проблемой, когда у меня есть скрипт Node, который вызывает процесс, он выглядит следующим образом:

  // wslPath declared here (it's a shell file)
  const proc = cp.spawn('ubuntu.exe', ['run', wslPath]);

  let stdout = '';
  proc.stdout.on('data', data => stdout += data.toString());

  let stderr = '';
  proc.stderr.on('data', data => stderr += data.toString());

  return await new Promise((resolve, reject) => {
    proc.on('exit', async code => {
      await fs.remove(winPath);

      if (code) {
        reject({ code, stdout, stderr });
      }

      resolve({ stdout, stderr });
    });
  });

Как вы можете видеть, скрипт вызывает WSL. WSL включен на компьютере. Когда я запускаю этот скрипт вручную, он работает нормально. Когда я захожу на компьютер, скрипт использует RDP с другого компьютера и запускает его с теми же учетными данными, он также работает нормально. Но когда скрипт вызывается из запланированной задачи, которая также выполняется с теми же учетными данными, вызов spawn возвращает:

(node:4684) UnhandledPromiseRejectionWarning: Error: spawn UNKNOWN
    at ChildProcess.spawn (internal/child_process.js:394:11)
    at Object.spawn (child_process.js:540:9)

Я проверил, что пользователь такой же, войдя в систему require('os').userInfo() и require('child_process').spawnSync('whoami', { encoding: 'utf8' }), и он возвращает то же самое во всех трех случаях.

Я предполагаю, что это потому, что ubuntu.exe не найдено, но я не знаю, почему это будет, поскольку пользователь является то же самое во всех трех случаях.

В чем может быть причина этого и как я могу отладить это дальше?

1 Ответ

1 голос
/ 07 января 2020

Планировщик задач Windows позволяет указать пользователя для запуска от имени (по причинам привилегий), но не предоставляет среду (PATH и другие переменные среды), настроенные для этого пользователя.

Таким образом, при запуске программ из планировщика задач Windows важно не делать никаких предположений о том, что находится в среде (особенно в PATH). Если моя программа зависит от определенных вещей в среде, я иногда изменяю свою задачу на файл .BAT, который сначала настраивает среду по мере необходимости, а затем запускает мою программу оттуда.

Среди прочего, Простейший способ не полагаться на путь - указать полный путь к исполняемому файлу, который вы запускаете, а не предполагать, что он будет где-то найден в пути. Но вам также необходимо убедиться, что ваш исполняемый файл может найти любые другие ресурсы, которые могут ему понадобиться, без каких-либо переменных среды, или вам необходимо настроить эти переменные среды перед его запуском.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...