Informazioni sui dettagli del processo
DESCRIZIONE BREVE
Fornisce informazioni dettagliate sui processi in background in computer locali e remoti.
DESCRIZIONE DETTAGLIATA
In questo argomento viene illustrato il concetto di processo in background e vengono fornite informazioni tecniche sul funzionamento dei processi in background in PowerShell.
Questo argomento è un supplemento per la about_Jobs e about_Remote_Jobs argomenti.
INFORMAZIONI SUI PROCESSI IN BACKGROUND
Un processo in background esegue un comando o un'espressione in modo asincrono. Potrebbe eseguire un cmdlet, una funzione, uno script o qualsiasi altra attività basata su comandi. È progettato per eseguire comandi che impiegano un lungo periodo di tempo, 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. Un processo in background, tuttavia, non impedisce il prompt di PowerShell. Un comando per avviare un processo in background restituisce un oggetto processo. Il prompt viene restituito immediatamente, in modo da poter lavorare su altre attività durante l'esecuzione del processo in background.
Tuttavia, quando si avvia un processo in background, i risultati non vengono immediatamente ottenuti anche se il processo viene eseguito molto rapidamente. L'oggetto processo restituito contiene informazioni utili sul processo, ma non contiene i risultati del processo. È necessario eseguire un comando separato per ottenere i risultati del processo. È anche possibile eseguire comandi per arrestare il processo, attendere il completamento del processo ed eliminare il processo.
Per eseguire la temporizzazione di un processo in background indipendentemente da altri comandi, ogni processo in background viene eseguito nel proprio ambiente di PowerShell (una "sessione"). Tuttavia, può trattarsi di una connessione temporanea che viene creata solo per eseguire il processo e viene quindi distrutta o può essere una sessione persistente (PSSession) che può essere usata per eseguire diversi processi o comandi correlati.
USO DEI CMDLET JOB
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 disattivare il prompt dei comandi finché non vengono completati 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 ulteriori informazioni sul funzionamento dei cmdlet, vedere l'argomento della Guida per ogni cmdlet e vedere about_Jobs.
AVVIO DEI PROCESSI IN BACKGROUND IN COMPUTER REMOTI
È possibile creare e gestire processi in background in un computer locale o remoto. Per eseguire un processo in background in modalità remota, usare il parametro AsJob di un cmdlet, ad esempio Invoke-Command, oppure usare il cmdlet Invoke-Command per eseguire un comando Start-Job in modalità remota. È 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 con Start-Job o il parametro AsJob di Invoke-Command, il processo padre è un dirigente. Non esegue alcun comando né restituisce alcun risultato. I comandi vengono effettivamente eseguiti dai processi figlio. I processi avviati con 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 è stato 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 di stato, usare il parametro ChildJobState del cmdlet Get-Job. Il parametro ChildJobState è stato 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 utilizzato 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 è identico a quello 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. Se ad esempio si arresta un processo padre, vengono arrestati tutti i processi figlio. Se si ottengono i risultati di un processo padre, si ottengono i risultati di tutti i processi figlio.
Tuttavia, è anche possibile gestire i processi figlio singolarmente. Questa operazione è particolarmente utile quando si desidera analizzare un problema relativo a un processo o ottenere i risultati di uno solo di alcuni processi figlio avviati utilizzando il parametro AsJob di Invoke-Command. Il carattere di apice inverso ['] è il carattere di continuazione.
Il comando seguente usa il parametro AsJob di Invoke-Command per avviare i processi in background nel computer locale e in 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, viene indicato che 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 indicato 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. È anche possibile ottenere i risultati di un determinato processo figlio, 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 un maggiore controllo sui processi che vengono eseguiti.
TIPI DI PROCESSO
PowerShell supporta diversi tipi di processi per diverse attività. A partire da Windows PowerShell 3,0, gli sviluppatori possono scrivere "adattatori di origine dei processi" che aggiungono nuovi tipi di processo a PowerShell e includono gli adattatori di origine dei processi nei moduli. Quando si importa il modulo, è possibile usare il nuovo tipo di processo nella sessione.
Ad esempio, il modulo PSScheduledJob aggiunge i processi pianificati e il modulo PSWorkflow aggiunge processi del flusso di lavoro.
I tipi di processi personalizzati potrebbero differire significativamente rispetto ai processi in background di Windows PowerShell standard. Ad esempio, i processi pianificati vengono salvati su disco; non esistono solo in una sessione specifica. 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, usare 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 relativi al 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 restituiti da Get-Job indica il tipo di processo.
La tabella seguente elenca i tipi di processo dotati di PowerShell.
Tipo di processo | Descrizione |
---|---|
BackgroundJob | Avviata usando il cmdlet Start-Job. |
RemoteJob | Avviato con il parametro AsJob del cmdlet Invoke-Command |
. | |
PSWorkflowJob | Avviato utilizzando il parametro AsJob di un flusso di lavoro. |
PSScheduledJob | Istanza di un processo pianificato avviato da un trigger di processo. |
CIMJob | Avviato utilizzando il parametro AsJob di un cmdlet da un |
Modulo CDXML. | |
WMIJob | Avviato utilizzando 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 determinato tipo, verificare che il modulo che aggiunge il tipo di processo venga importato nella sessione corrente. In caso contrario, Get-Job non ottiene i 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 tutte le istanze avviate 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 che viene 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
Creare un flusso di lavoro.
PS> workflow Test-Workflow {Get-Process}
Eseguire il flusso di lavoro come un 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 i processi pianificati, ma ottiene le istanze del processo pianificato che vengono avviate.
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 i processi pianificati, usare il cmdlet Get-ScheduledJob.
PS> Get-ScheduledJob
Id Name JobTriggers Command Enabled
-- ---- ----------- ------- -------
1 ScheduledJob 1 Get-Process True