# 9 Command execution

Zabbix uses common functionality to execute user parameters, remote
commands, system.run\[\] items without the "nowait" flag, scripts
(alert, external and global) and some internal commands.

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

1.  Zabbix (the parent process) creates a pipe for communication
2.  Zabbix sets the pipe as the output for the to-be-created child
    process
3.  Zabbix 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.  Zabbix 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, Zabbix waits until the initial
    child process exits or timeout occurs
7.  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

::: noteimportant
Steps 5-7 do not refer to remote commands as they
are executed with a "nowait" flag.
:::

::: noteimportant
Zabbix 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.

Read more about [user parameters](/manual/config/items/userparameters),
[remote
commands](/manual/config/notifications/action/operation/remote_command),
[alert scripts](/manual/config/notifications/media/script).
