Informazioni sui processiAbout Jobs

Breve descrizioneShort description

Fornisce informazioni sul modo in cui i processi in background di PowerShell eseguono un comando o un'espressione in background senza interagire con la sessione corrente.Provides information about how PowerShell background jobs run a command or expression in the background without interacting with the current session.

Descrizione lungaLong description

PowerShell esegue simultaneamente comandi e script tramite processi.PowerShell concurrently runs commands and scripts through jobs. Sono disponibili tre tipi di processi forniti da PowerShell per supportare la concorrenza.There are three jobs types provided by PowerShell to support concurrency.

  • RemoteJob -Comandi e script vengono eseguiti in una sessione remota.RemoteJob - Commands and scripts run on a remote session. Per informazioni, vedere about_Remote_Jobs.For information, see about_Remote_Jobs.
  • BackgroundJob -I comandi e gli script vengono eseguiti in un processo separato nel computer locale.BackgroundJob - Commands and scripts run in a separate process on the local machine.
  • PSTaskJob o ThreadJob : i comandi e gli script vengono eseguiti in un thread separato nello stesso processo nel computer locale.PSTaskJob or ThreadJob - Commands and scripts run in a separate thread within the same process on the local machine. Per ulteriori informazioni, vedere about_Thread_Jobs.For more information, see about_Thread_Jobs.

L'esecuzione di script in remoto, in un computer separato o in un processo separato, garantisce un notevole isolamento.Running scripts remotely, on a separate machine or in a separate process, provides great isolation. Gli eventuali errori che si verificano nel processo remoto non influiscono su altri processi in esecuzione o sulla sessione padre che ha avviato il processo.Any errors that occur in the remote job do not affect other running jobs or the parent session that started the job. Tuttavia, il livello di comunicazione remota aumenta l'overhead, inclusa la serializzazione degli oggetti.However, the remoting layer adds overhead, including object serialization. Tutti gli oggetti vengono serializzati e deserializzati quando vengono passati tra la sessione padre e la sessione remota (processo).All objects are serialized and deserialized as they are passed between the parent session and the remote (job) session. La serializzazione di oggetti dati complessi di grandi dimensioni può utilizzare grandi quantità di risorse di calcolo e di memoria e trasferire grandi quantità di dati in rete.Serialization of large complex data objects can consume large amounts of compute and memory resources and transfer large amounts of data across the network.

I processi basati su thread non sono altrettanto affidabili come i processi in background e remoti, perché vengono eseguiti nello stesso processo su thread diversi.Thread-based jobs are not as robust as remote and background jobs, because they run in the same process on different threads. Se un processo presenta un errore critico che arresta il processo, tutti gli altri processi nel processo vengono interrotti.If one job has a critical error that crashes the process, then all other jobs in the process are terminated.

Tuttavia, i processi basati su thread richiedono un sovraccarico minore.However, thread-based jobs require less overhead. Non usano il livello di comunicazione remota o la serializzazione.They don't use the remoting layer or serialization. Gli oggetti risultato vengono restituiti come riferimenti a oggetti attivi nella sessione corrente.The result objects are returned as references to live objects in the current session. Senza questo overhead, i processi basati su thread vengono eseguiti più velocemente e utilizzano un minor numero di risorse rispetto agli altri tipi di processo.Without this overhead, thread-based jobs run faster and use fewer resources than the other job types.

Importante

La sessione padre che ha creato il processo monitora anche lo stato del processo e raccoglie i dati della pipeline.The parent session that created the job also monitors the job status and collects pipeline data. Il processo figlio del processo viene terminato dal processo padre una volta che il processo ha raggiunto lo stato completato.The job child process is terminated by the parent process once the job reaches a finished state. Se la sessione padre viene terminata, tutti i processi figlio in esecuzione vengono terminati insieme ai relativi processi figlio.If the parent session is terminated, all running child jobs are terminated along with their child processes.

Esistono due modi per aggirare questa situazione:There are two ways work around this situation:

  1. Utilizzare Invoke-Command per creare processi eseguiti in sessioni disconnesse.Use Invoke-Command to create jobs that run in disconnected sessions. Per ulteriori informazioni, vedere about_Remote_Jobs.For more information, see about_Remote_Jobs.
  2. Utilizzare Start-Process per creare un nuovo processo anziché un processo.Use Start-Process to create a new process rather than a job. Per ulteriori informazioni, vedere Start-Process.For more information, see Start-Process.

Cmdlet JobThe job cmdlets

CmdletCmdlet DescrizioneDescription
Start-Job Avvia un processo in background in un computer locale.Starts a background job on a local computer.
Get-Job Ottiene i processi in background avviati nellaGets the background jobs that were started in the
sessione corrente.current session.
Receive-Job Ottiene i risultati dei processi in background.Gets the results of background jobs.
Stop-Job Arresta un processo in background.Stops a background job.
Wait-Job Disattiva il prompt dei comandi fino a quando uno o tutti i processi sonoSuppresses the command prompt until one or all jobs are
completare.complete.
Remove-Job Elimina un processo in background.Deletes a background job.
Invoke-Command Il parametro AsJob crea un processo in background in unThe AsJob parameter creates a background job on a
computer remoto.remote computer. È possibile utilizzare Invoke-Command per eseguireYou can use Invoke-Command to run
qualsiasi comando di processo in remoto, incluso Start-Job .any job command remotely, including Start-Job.

Come avviare un processo nel computer localeHow to start a job on the local computer

Per avviare un processo in background nel computer locale, usare il Start-Job cmdlet.To start a background job on the local computer, use the Start-Job cmdlet.

Per scrivere un Start-Job comando, racchiudere il comando che il processo viene eseguito tra parentesi graffe ( {} ).To write a Start-Job command, enclose the command that the job runs in curly braces ({}). Usare il parametro scriptblock per specificare il comando.Use the ScriptBlock parameter to specify the command.

Il comando seguente avvia un processo in background che esegue un Get-Process comando nel computer locale.The following command starts a background job that runs a Get-Process command on the local computer.

Start-Job -ScriptBlock {Get-Process}

Quando si avvia un processo in background, il prompt dei comandi viene restituito immediatamente, anche se il completamento del processo richiede un tempo prolungato.When you start a background job, the command prompt returns immediately, even if the job takes an extended time to complete. È possibile continuare a lavorare nella sessione senza interruzioni durante l'esecuzione del processo.You can continue to work in the session without interruption while the job runs.

Il Start-Job comando restituisce un oggetto che rappresenta il processo.The Start-Job command returns an object that represents the job. L'oggetto processo contiene informazioni utili sul processo, ma non contiene i risultati del processo.The job object contains useful information about the job, but it does not contain the job results.

È possibile salvare l'oggetto processo in una variabile e usarlo con gli altri cmdlet Job per gestire il processo in background.You can save the job object in a variable and then use it with the other Job cmdlets to manage the background job. Il comando seguente avvia un oggetto processo e salva l'oggetto processo risultante nella $job variabile.The following command starts a job object and saves the resulting job object in the $job variable.

$job = Start-Job -ScriptBlock {Get-Process}

A partire da PowerShell 6,0, è possibile usare l'operatore in background ( & ) alla fine di una pipeline per avviare un processo in background.Beginning in PowerShell 6.0, you can use the background operator (&) at the end of a pipeline to start a background job. Per ulteriori informazioni, vedere operatore background.For more information, see background operator.

L'utilizzo dell'operatore background equivale dal punto di vista funzionale all'utilizzo del Start-Job cmdlet nell'esempio precedente.Using the background operator is functionally equivalent to using the Start-Job cmdlet in the previous example.

$job = Get-Process &

Recupero di oggetti processoGetting job objects

Il Get-Job cmdlet restituisce gli oggetti che rappresentano i processi in background avviati nella sessione corrente.The Get-Job cmdlet returns objects that represent the background jobs that were started in the current session. Senza parametri, Get-Job restituisce tutti i processi avviati nella sessione corrente.Without parameters, Get-Job returns all of the jobs that were started in the current session.

Get-Job

L'oggetto processo contiene lo stato del processo, che indica se il processo è terminato.The job object contains the state of the job, which indicates whether the job has finished. Lo stato di un processo completato è completato o non riuscito.A finished job has a state of Complete or Failed. Un processo potrebbe essere anche bloccato o in esecuzione.A job might also be Blocked or Running.

Id  Name  PSJobTypeName State      HasMoreData  Location   Command
--  ----  ------------- -----      -----------  --------   -------
1   Job1  BackgroundJob Complete   True         localhost  Get-Process

È possibile salvare l'oggetto processo in una variabile e usarlo per rappresentare il processo in un comando successivo.You can save the job object in a variable and use it to represent the job in a later command. Il comando seguente ottiene il processo con ID 1 e lo salva nella $job variabile.The following command gets the job with ID 1 and saves it in the $job variable.

$job = Get-Job -Id 1

Ottenere i risultati di un processoGetting the results of a job

Quando si esegue un processo in background, i risultati non vengono visualizzati immediatamente.When you run a background job, the results do not appear immediately. Per ottenere i risultati di un processo in background, usare il Receive-Job cmdlet.To get the results of a background job, use the Receive-Job cmdlet.

Nell'esempio seguente il Receive-Job cmdlet ottiene i risultati del processo utilizzando l'oggetto processo nella $job variabile.The following example, the Receive-Job cmdlet gets the results of the job using job object in the $job variable.

Receive-Job -Job $job
Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)    Id ProcessName
-------  ------    -----      ----- -----   ------    -- -----------
    103       4    11328       9692    56           1176 audiodg
    804      14    12228      14108   100   101.74  1740 CcmExec
    668       7     2672       6168   104    32.26   488 csrss
...

È possibile salvare i risultati di un processo in una variabile.You can save the results of a job in a variable. Il comando che segue salva i risultati del processo nella variabile nella variabile $job $results .The following command saves the results of the job in the $job variable to the $results variable.

$results = Receive-Job -Job $job

Recupero e mantenimento dei risultati parziali del processoGetting and keeping partial job results

Il Receive-Job cmdlet ottiene i risultati di un processo in background.The Receive-Job cmdlet gets the results of a background job. Se il processo è completo, Receive-Job ottiene tutti i risultati del processo.If the job is complete, Receive-Job gets all job results. Se il processo è ancora in esecuzione, Receive-Job ottiene i risultati generati finora.If the job is still running, Receive-Job gets the results that have been generated thus far. È possibile eseguire Receive-Job di nuovo i comandi per ottenere i risultati rimanenti.You can run Receive-Job commands again to get the remaining results.

Per impostazione predefinita, Receive-Job Elimina i risultati dalla cache in cui vengono archiviati i risultati del processo.By default, Receive-Job deletes the results from the cache where job results are stored. Quando si esegue Receive-Job nuovamente, si ottengono solo i nuovi risultati che arrivano dopo la prima esecuzione.When you run Receive-Job again, you get only the new results that arrived after the first run.

I comandi seguenti mostrano i risultati dei Receive-Job comandi eseguiti prima del completamento del processo.The following commands show the results of Receive-Job commands run before the job is complete.

C:\PS> Receive-Job -Job $job

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    103       4    11328       9692    56            1176 audiodg
    804      14    12228      14108   100   101.74   1740 CcmExec

C:\PS> Receive-Job -Job $job

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    68       3     2632        664    29     0.36   1388 ccmsetup
   749      22    21468      19940   203   122.13   3644 communicator
   905       7     2980       2628    34   197.97    424 csrss
  1121      25    28408      32940   174   430.14   3048 explorer

Usare il parametro Keep per impedire Receive-Job l'eliminazione dei risultati del processo restituiti.Use the Keep parameter to prevent Receive-Job from deleting the job results that are returned. Nei comandi seguenti viene illustrato l'effetto dell'utilizzo del parametro Keep in un processo non ancora completato.The following commands show the effect of using the Keep parameter on a job that is not yet complete.

C:\PS> Receive-Job -Job $job -Keep

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    103       4    11328       9692    56            1176 audiodg
    804      14    12228      14108   100   101.74   1740 CcmExec

C:\PS> Receive-Job -Job $job -Keep

Handles  NPM(K)    PM(K)      WS(K) VM(M)   CPU(s)     Id ProcessName
-------  ------    -----      ----- -----   ------     -- -----------
    103       4    11328       9692    56            1176 audiodg
    804      14    12228      14108   100   101.74   1740 CcmExec
     68       3     2632        664    29     0.36   1388 ccmsetup
    749      22    21468      19940   203   122.13   3644 communicator
    905       7     2980       2628    34   197.97    424 csrss
   1121      25    28408      32940   174   430.14   3048 explorer

In attesa dei risultatiWaiting for the results

Se si esegue un comando che richiede molto tempo per il completamento, è possibile usare le proprietà dell'oggetto processo per determinare quando il processo è completo.If you run a command that takes a long time to complete, you can use the properties of the job object to determine when the job is complete. Il comando seguente usa l' Get-Job oggetto per ottenere tutti i processi in background nella sessione corrente.The following command uses the Get-Job object to get all of the background jobs in the current session.

Get-Job

I risultati vengono visualizzati in una tabella.The results appear in a table. Lo stato del processo viene visualizzato nella colonna stato .The status of the job appears in the State column.

Id Name  PSJobTypeName State    HasMoreData Location  Command
-- ----  ------------- -----    ----------- --------  -------
1  Job1  BackgroundJob Complete True        localhost Get-Process
2  Job2  BackgroundJob Running  True        localhost Get-EventLog -Log ...
3  Job3  BackgroundJob Complete True        localhost dir -Path C:\* -Re...

In questo caso, la proprietà state rivela che il processo 2 è ancora in esecuzione.In this case, the State property reveals that Job 2 is still running. Se si utilizza il Receive-Job cmdlet per ottenere i risultati del processo adesso, i risultati saranno incompleti.If you were to use the Receive-Job cmdlet to get the job results now, the results would be incomplete. È possibile utilizzare Receive-Job ripetutamente il cmdlet per ottenere tutti i risultati.You can use the Receive-Job cmdlet repeatedly to get all of the results. Utilizzare la proprietà state per determinare quando il processo è completo.Use the State property to determine when the job is complete.

È anche possibile usare il parametro wait del Receive-Job cmdlet.You can also use the Wait parameter of the Receive-Job cmdlet. Quando si usa questo parametro, il cmdlet non restituisce il prompt dei comandi finché il processo non viene completato e tutti i risultati sono disponibili.When use use this parameter, the cmdlet does not return the command prompt until the job is completed and all results are available.

È inoltre possibile utilizzare il Wait-Job cmdlet per attendere uno o tutti i risultati del processo.You can also use the Wait-Job cmdlet to wait for any or all of the results of the job. Wait-Job consente di attendere uno o più processi specifici o tutti i processi.Wait-Job lets you wait for one or more specific job or for all jobs. Il comando seguente usa il Wait-Job cmdlet per attendere un processo con IDThe following command uses the Wait-Job cmdlet to wait for a job with ID 10.

Wait-Job -ID 10

Di conseguenza, il prompt di PowerShell viene eliminato fino al completamento del processo.As a result, the PowerShell prompt is suppressed until the job is completed.

È anche possibile attendere un periodo di tempo predeterminato.You can also wait for a predetermined period of time. Questo comando usa il parametro timeout per limitare l'attesa a 120 secondi.This command uses the Timeout parameter to limit the wait to 120 seconds. Al termine dell'intervallo di tempo, il prompt dei comandi viene restituito, ma l'esecuzione del processo continua in background.When the time expires, the command prompt returns, but the job continues to run in the background.

Wait-Job -ID 10 -Timeout 120

Arresto di un processoStopping a job

Per arrestare un processo in background, utilizzare il Stop-Job cmdlet.To stop a background job, use the Stop-Job cmdlet. Il comando seguente avvia un processo per ottenere ogni voce nel registro eventi di sistema.The following command starts a job to get every entry in the System event log. Salva l'oggetto processo nella $job variabile.It saves the job object in the $job variable.

$job = Start-Job -ScriptBlock {Get-EventLog -Log System}

Il comando seguente arresta il processo.The following command stops the job. Usa un operatore pipeline ( | ) per inviare il processo nella $job variabile a Stop-Job .It uses a pipeline operator (|) to send the job in the $job variable to Stop-Job.

$job | Stop-Job

Eliminazione di un processoDeleting a job

Per eliminare un processo in background, usare il Remove-Job cmdlet.To delete a background job, use the Remove-Job cmdlet. Il comando che segue elimina il processo nella $job variabile.The following command deletes the job in the $job variable.

Remove-Job -Job $job

Analisi di un processo non riuscitoInvestigating a failed job

I processi possono avere esito negativo per diversi motivi.Jobs can fail for many reasons. l'oggetto processo contiene una proprietà reason che contiene informazioni sulla causa dell'errore.the job object contains a Reason property that contains information about the cause of the failure.

Nell'esempio seguente viene avviato un processo senza le credenziali necessarie.The following example starts a job without the required credentials.

$job = Start-Job -ScriptBlock {New-Item -Path HKLM:\Software\MyCompany}
Get-Job $job

Id Name  PSJobTypeName State  HasMoreData  Location  Command
-- ----  ------------- -----  -----------  --------  -------
1  Job1  BackgroundJob Failed False        localhost New-Item -Path HKLM:...

Controllare la proprietà reason per individuare l'errore che ha causato l'esito negativo del processo.Inspect the Reason property to find the error that caused the job to fail.

$job.ChildJobs[0].JobStateInfo.Reason

In questo caso, il processo non è riuscito perché il computer remoto richiede le credenziali esplicite per eseguire il comando.In this case, the job failed because the remote computer required explicit credentials to run the command. La proprietà reason contiene il messaggio seguente:The Reason property contains the following message:

Connessione al server remoto non riuscita con il seguente messaggio di errore: "accesso negato".Connecting to remote server failed with the following error message: "Access is denied".

Vedere ancheSee also