Condividi tramite


Informazioni sui dettagli del processo

DESCRIZIONE BREVE

Fornisce informazioni dettagliate sui processi in background nei computer locali e remoti.

DESCRIZIONE DETTAGLIATA

Questo argomento illustra il concetto di processo in background e fornisce informazioni tecniche sul funzionamento dei processi in background in PowerShell.

Questo argomento è un supplemento agli argomenti about_Jobs e about_Remote_Jobs .

INFORMAZIONI SUI PROCESSI IN BACKGROUND

Un processo in background esegue un comando o un'espressione in modo asincrono. Può eseguire un cmdlet, una funzione, uno script o qualsiasi altra attività basata su comandi. È progettato per eseguire comandi che richiedono un periodo di tempo prolungato, ma è possibile usarlo per eseguire qualsiasi comando in background.

Quando viene eseguito un comando sincrono, il prompt dei comandi di PowerShell viene eliminato fino al completamento del comando. Tuttavia, un processo in background non elimina il prompt di PowerShell. Un comando per avviare un processo in background restituisce un oggetto processo. La richiesta restituisce immediatamente in modo che sia possibile lavorare su altre attività durante l'esecuzione del processo in background.

Tuttavia, quando si avvia un processo in background, non si ottengono immediatamente i risultati anche se il processo viene eseguito molto rapidamente. L'oggetto processo restituito contiene informazioni utili sul processo, ma non contiene i risultati del processo. Per ottenere i risultati del processo, è necessario eseguire un comando separato. È anche possibile eseguire comandi per arrestare il processo, attendere il completamento del processo e eliminare il processo.

Per rendere l'intervallo di un processo in background indipendente da altri comandi, ogni processo in background viene eseguito nel proprio ambiente PowerShell (una "sessione"). Tuttavia, può trattarsi di una connessione temporanea creata solo per eseguire il processo e quindi eliminata definitivamente oppure può essere una sessione persistente (pssession) che è possibile usare per eseguire diversi processi o comandi correlati.

USO DEI CMDLET DI PROCESSO

Usare un comando Start-Job per avviare un processo in background in un computer locale. Start-Job restituisce un oggetto processo. È anche possibile ottenere oggetti che rappresentano i processi avviati nel computer locale usando il cmdlet Get-Job.

Per ottenere i risultati del processo, usare un comando Receive-Job. Se il processo non è completo, Receive-Job restituisce risultati parziali. È anche possibile usare il cmdlet Wait-Job per eliminare il prompt dei comandi fino al completamento di uno o tutti i processi avviati nella sessione.

Per arrestare un processo in background, usare il cmdlet Stop-Job. Per eliminare un processo, usare il cmdlet Remove-Job.

Per altre informazioni sul funzionamento dei cmdlet, vedere l'argomento della Guida per ogni cmdlet e vedere about_Jobs.

AVVIO DI PROCESSI IN BACKGROUND NEI COMPUTER REMOTI

È possibile creare e gestire processi in background in un computer locale o remoto. Per eseguire un processo in background in remoto, usare il parametro AsJob di un cmdlet, ad esempio Invoke-Command, oppure usare il cmdlet Invoke-Command per eseguire un comando Start-Job in remoto. È anche possibile avviare un processo in background in una sessione interattiva.

Per altre informazioni sui processi remoti in background, vedere about_Remote_Jobs.

PROCESSI FIGLIO

Ogni processo in background è costituito da un processo padre e da uno o più processi figlio. Nei processi avviati usando Start-Job o il parametro AsJob di Invoke-Command, il processo padre è un esecutivo. Non esegue alcun comando o restituisce risultati. I comandi vengono effettivamente eseguiti dai processi figlio. I processi avviati usando altri cmdlet potrebbero funzionare in modo diverso.

I processi figlio vengono archiviati nella proprietà ChildJobs dell'oggetto processo padre. La proprietà ChildJobs può contenere uno o più oggetti processo figlio. Gli oggetti processo figlio hanno un nome, un ID e un ID istanza diversi dal processo padre in modo che sia possibile gestire i processi padre e figlio singolarmente o come unità.

Per ottenere i processi padre e figlio di un processo, usare il parametro IncludeChildJobs del cmdlet Get-Job. Il parametro IncludeChildJob viene introdotto in Windows PowerShell 3.0.

PS> Get-Job -IncludeChildJob

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
1  Job1   RemoteJob     Failed     True          localhost   Get-Process
2  Job2                 Completed  True          Server01    Get-Process
3  Job3                 Failed     False         localhost   Get-Process

Per ottenere il processo padre e solo i processi figlio con un determinato valore State, usare il parametro ChildJobState del cmdlet Get-Job. Il parametro ChildJobState viene introdotto in Windows PowerShell 3.0.

PS> Get-Job -ChildJobState Failed

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
1  Job1   RemoteJob     Failed     True          localhost   Get-Process
3  Job3                 Failed     False         localhost   Get-Process

Per ottenere i processi figlio di un processo in tutte le versioni di PowerShell, usare la proprietà ChildJob del processo padre.

PS> (Get-Job Job1).ChildJobs

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
2  Job2                 Completed  True          Server01    Get-Process
3  Job3                 Failed     False         localhost   Get-Process

È anche possibile usare un comando Get-Job nel processo figlio, come illustrato nel comando seguente:

PS> Get-Job Job3

Id Name   PSJobTypeName State      HasMoreData   Location    Command
-- ----   ------------- -----      -----------   --------    -------
3  Job3                 Failed     False         localhost   Get-Process

La configurazione del processo figlio dipende dal comando usato per avviare il processo.

  • Quando si usa Start-Job per avviare un processo in un computer locale, il processo è costituito da un processo padre esecutivo e da un processo figlio che esegue il comando .

  • Quando si usa il parametro AsJob di Invoke-Command per avviare un processo in uno o più computer, il processo è costituito da un processo padre esecutivo e da un processo figlio per ogni processo eseguito in ogni computer.

  • Quando si usa Invoke-Command per eseguire un comando Start-Job in uno o più computer remoti, il risultato è lo stesso di un comando locale eseguito in ogni computer remoto. Il comando restituisce un oggetto processo per ogni computer. L'oggetto processo è costituito da un processo padre esecutivo e da un processo figlio che esegue il comando .

Il processo padre rappresenta tutti i processi figlio. Quando si gestisce un processo padre, si gestiscono anche i processi figlio associati. Ad esempio, se si arresta un processo padre, tutti i processi figlio vengono arrestati. Se si ottengono i risultati di un processo padre, si ottengono i risultati di tutti i processi figlio.

Tuttavia, è anche possibile gestire singolarmente i processi figlio. Ciò è particolarmente utile quando si vuole analizzare un problema con un processo o ottenere i risultati di un solo numero di processi figlio avviati usando il parametro AsJob di Invoke-Command. Il carattere di backtick ['] è il carattere di continuazione.

Il comando seguente usa il parametro AsJob di Invoke-Command per avviare processi in background nel computer locale e due computer remoti. Il comando salva il processo nella variabile $j.

PS> $j = Invoke-Command -ComputerName localhost, Server01, Server02 `
-Command {Get-Date} -AsJob

Quando si visualizzano le proprietà Name e ChildJob del processo in $j, il comando ha restituito un oggetto processo con tre processi figlio, uno per ogni computer.

PS> $j | Format-List Name, ChildJobs

Name      : Job3
ChildJobs : {Job4, Job5, Job6}

Quando si visualizza il processo padre, viene visualizzato che il processo non è riuscito.

PS> $j

Id Name   PSJobTypeName State      HasMoreData   Location
-- ----   ------------- -----      -----------   --------
3  Job3   RemotingJob   Failed     False         localhost,Server...

Tuttavia, quando si esegue un comando Get-Job che ottiene i processi figlio, l'output mostra che solo un processo figlio non è riuscito.

PS> Get-Job -IncludeChildJobs

Id  Name   PSJobTypeName State      HasMoreData   Location    Command
--  ----   ------------- -----      -----------   --------    -------
3   Job3   RemotingJob   Failed     False         localhost,Server...
4   Job4                 Completed  True          localhost   Get-Date
5   Job5                 Failed     False         Server01    Get-Date
6   Job6                 Completed  True          Server02    Get-Date

Per ottenere i risultati di tutti i processi figlio, usare il cmdlet Receive-Job per ottenere i risultati del processo padre. Ma è anche possibile ottenere i risultati di un processo figlio specifico, come illustrato nel comando seguente.

PS> Receive-Job -Name Job6 -Keep | Format-Table ComputerName,
>> DateTime -AutoSize
ComputerName DateTime
------------ --------
Server02     Thursday, March 13, 2008 4:16:03 PM

La funzionalità processi figlio dei processi in background di PowerShell offre maggiore controllo sui processi eseguiti.

TIPI DI PROCESSO

PowerShell supporta diversi tipi di processi per attività diverse. A partire da Windows PowerShell 3.0, gli sviluppatori possono scrivere "adattatori di origine processo" che aggiungono nuovi tipi di processo a PowerShell e includono gli adattatori di origine del processo nei moduli. Quando si importa il modulo, è possibile usare il nuovo tipo di processo nella sessione.

Ad esempio, il modulo PSScheduledJob aggiunge processi pianificati e il modulo PSWorkflow aggiunge processi del flusso di lavoro.

I tipi di processi personalizzati possono differire in modo significativo rispetto ai processi in background Windows PowerShell standard. Ad esempio, i processi pianificati vengono salvati su disco; non esistono solo in una determinata sessione. I processi del flusso di lavoro possono essere sospesi e ripresi.

I cmdlet usati per gestire i processi personalizzati dipendono dal tipo di processo. Per alcuni, si usano i cmdlet di processo standard, ad esempio Get-Job e Start-Job. Altri sono dotati di cmdlet specializzati che gestiscono solo un particolare tipo di processo. Per informazioni dettagliate sui tipi di processo personalizzati, vedere gli argomenti della Guida sul tipo di processo.

Per trovare il tipo di processo di un processo, usare il cmdlet Get-Job. Get-Job restituisce oggetti processo diversi per diversi tipi di processi. Il valore della proprietà PSJobTypeName degli oggetti processo che Get-Job restituisce indica il tipo di processo.

La tabella seguente elenca i tipi di processo inclusi in PowerShell.

Tipo di processo Descrizione
BackgroundJob Avviato usando il cmdlet Start-Job.
RemoteJob Avviato usando il parametro AsJob del Invoke-Command
.
PSWorkflowJob Avviato usando il parametro AsJob di un flusso di lavoro.
PSScheduledJob Istanza di un processo pianificato avviato da un trigger di processo.
CIMJob Avviato usando il parametro AsJob di un cmdlet da un
Modulo CDXML.
WMIJob Avviato usando il parametro AsJob di un cmdlet da un
Modulo WMI.
PSEventJob Creato eseguendo Register-ObjectEvent e specificando un
azione con il parametro Action.

NOTA: prima di usare il cmdlet Get-Job per ottenere i processi di un particolare tipo, verificare che il modulo che aggiunge il tipo di processo venga importato nella sessione corrente. In caso contrario, Get-Job non ottiene processi di quel tipo.

ESEMPIO

I comandi seguenti creano un processo in background locale, un processo in background remoto, un processo del flusso di lavoro e un processo pianificato. Usa quindi il cmdlet Get-Job per ottenere i processi. Get-Job non ottiene il processo pianificato, ma ottiene le istanze iniziali del processo pianificato.

Avviare un processo in background nel computer locale.

PS> Start-Job -Name LocalData {Get-Process}

Id Name        PSJobTypeName   State   HasMoreData   Location   Command
-- ----        -------------   -----   -----------   --------   -------
2  LocalData   BackgroundJob   Running        True   localhost  Get-Process

Avviare un processo in background eseguito in un computer remoto.

PS> Invoke-Command -ComputerName Server01 {Get-Process} `
-AsJob -JobName RemoteData

Id  Name        PSJobTypeName  State   HasMoreData   Location   Command
--  ----        -------------  -----   -----------   --------   -------
2   RemoteData  RemoteJob      Running        True   Server01   Get-Process

Creare un processo pianificato

PS>  Register-ScheduledJob -Name ScheduledJob -ScriptBlock `
 {Get-Process} -Trigger (New-JobTrigger -Once -At "3 PM")

Id         Name            JobTriggers     Command       Enabled
--         ----            -----------     -------       -------
1          ScheduledJob    1               Get-Process   True

Create un flusso di lavoro.

PS> workflow Test-Workflow {Get-Process}

Eseguire il flusso di lavoro come processo.


PS> Test-Workflow -AsJob -JobName TestWFJob

Id  Name       PSJobTypeName   State   HasMoreData   Location   Command
--  ----       -------------   -----   -----------   --------   -------
2   TestWFJob  PSWorkflowJob   NotStarted     True   localhost  Get-Process

Ottenere i processi. Il Get-Job comando non ottiene processi pianificati, ma ottiene istanze del processo pianificato avviato.

PS> Get-Job

Id  Name         PSJobTypeName  State     HasMoreData  Location  Command
--  ----         -------------  -----     -----------  --------  -------
2   LocalData    BackgroundJob  Completed True         localhost Get-Process
4   RemoteData   RemoteJob      Completed True         Server01  Get-Process
6   TestWFJob    PSWorkflowJob  Completed True         localhost WorkflowJob
8   ScheduledJob PSScheduledJob Completed True         localhost Get-Process

Per ottenere processi pianificati, usare il cmdlet Get-ScheduledJob.

PS> Get-ScheduledJob

Id         Name            JobTriggers     Command       Enabled
--         ----            -----------     -------       -------
1          ScheduledJob    1               Get-Process   True

VEDERE ANCHE

about_Jobs

about_Remote_Jobs

about_Remote

about_Scheduled_Jobs

Invoke-Command

Start-Job

Get-Job

Wait-Job

Stop-Job

Remove-Job

Suspend-Job

Resume-Job

New-PSSession

Enter-PSSession

Exit-PSSession

Register-ScheduledJob

Get-ScheduledJob