Áú»¢¶Ä²©

8 Execu??o de comandos

O Áú»¢¶Ä²© usa uma funcionalidade em comum para executar par?metros de usu¨¢rios, comandos remotos, system.run[] sem a flag "nowait", scripts (alerta, externos e globais) e outros comandos internos.

O comando/script ¨¦ executado de forma similar nas plataformas UNIX e Windows:

  1. Áú»¢¶Ä²© (um de seus processos) cria uma ponte para comunica??o
  2. Áú»¢¶Ä²© configura a pote como a sa¨ªda para o processo a ser criado
  3. Áú»¢¶Ä²© cria o processo filho (executa o comando/script)
  4. Um novo grupo de processos (no Unix) ou um 'job' (no Windows) ¨¦ criado para os processos filhos
  5. O Áú»¢¶Ä²© l¨º do 'pipe' at¨¦ que o 'timeout' seja alcan?ado ou que ningu¨¦m esteja mais gravando nele (Todos os gerenciadores/descritores de arquivo tiverem sido fechados). Observe que o processo filho pode criar mais processos e sair antes de ter saido ou fechado o descritor de arquivo.
  6. Se o tempo limite n?o tiver sido alcan?ado o Áú»¢¶Ä²© aguarda at¨¦ que o processo saia ou que o timeout ocorra
  7. Neste ponto n¨®s estamos assumindo que tudo foi executado com sucesso e toda a ¨¢rvore de processos foi terminada

Os passos 5-7 n?o se referem a comandos remotos executados com a flag "nowait".

O Áú»¢¶Ä²© entende que o comando/script foi concluido quando o processo inicial ¨¦ finalizado E n?o existe outro processo que continue gerenciando os descritores de arquivos abertos. Quando o processamento ¨¦ conclu¨ªdo todos os processos que foram criados s?o terminados.

Todas as aspas duplas e contrabarras no comando ser?o escapadas com contrabarras e o comando ser¨¢ executado entre aspas duplas.

Leia mais sobre isso nos manuais de par?metros de usu¨¢rio, comandos remotos, scripts de alerta.

Execution steps

The command/script is executed similarly on both Unix and Windows platforms:

  1. Áú»¢¶Ä²© (the parent process) creates a pipe for communication
  2. Áú»¢¶Ä²© sets the pipe as the output for the to-be-created child process
  3. Áú»¢¶Ä²© creates the child process (runs the command/script)
  4. A new process group (in Unix) or a job (in Windows) is created for the child process
  5. Áú»¢¶Ä²© reads from the pipe until timeout occurs or no one is writing to the other end (ALL handles/file descriptors have been closed). Note that the child process can create more processes and exit before they exit or close the handle/file descriptor.
  6. If the timeout has not been reached, Áú»¢¶Ä²© waits until the initial child process exits or timeout occurs
  7. If the initial child process exited and the timeout has not been reached, Áú»¢¶Ä²© checks exit code of the initial child process and compares it to 0 (non-zero value is considered as execution failure, only for custom alert scripts, remote commands and user scripts executed on Áú»¢¶Ä²© server and Áú»¢¶Ä²© proxy)
  8. At this point it is assumed that everything is done and the whole process tree (i.e. the process group or the job) is terminated

Áú»¢¶Ä²© assumes that a command/script has done processing when the initial child process has exited AND no other process is still keeping the output handle/file descriptor open. When processing is done, ALL created processes are terminated.

All double quotes and backslashes in the command are escaped with backslashes and the command is enclosed in double quotes.

Exit code checking

Exit code are checked with the following conditions:

  • Only for custom alert scripts, remote commands and user scripts executed on Áú»¢¶Ä²© server and Áú»¢¶Ä²© proxy.
  • Any exit code that is different from 0 is considered as execution failure.
  • Contents of standard error and standard output for failed executions are collected and available in frontend (where execution result is displayed).
  • Additional log entry is created for remote commands on Áú»¢¶Ä²© server to save script execution output and can be enabled using LogRemoteCommands agent parameter.

Possible frontend messages and log entries for failed commands/scripts:

  • Contents of standard error and standard output for failed executions (if any).
  • "Process exited with code: N." (for empty output, and exit code not equal to 0).
  • "Process killed by signal: N." (for process terminated by a signal, on Linux only).
  • "Process terminated unexpectedly." (for process terminated for unknown reasons).

Read more about: