about_Job_Details

Aggiornamento: maggio 2014

Si applica a: Windows PowerShell 2.0, Windows PowerShell 3.0, Windows PowerShell 4.0, Windows PowerShell 5.0

ARGOMENTO

about_Job_Details

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 Windows 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 comando. È progettato per eseguire comandi che richiedono molto tempo, ma può essere usato per eseguire qualsiasi comando in background.

Quando viene eseguito un comando sincrono, il prompt dei comandi di Windows PowerShell viene eliminato fino al completamento del comando. Un processo in background, invece, non elimina il prompt di Windows PowerShell. Un comando di avvio di un processo in background restituisce un oggetto processo. Il prompt ritorna immediatamente per consentire di 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 i relativi risultati. Per ottenere i risultati del processo, è necessario eseguire un comando separato. È anche possibile eseguire comandi per arrestare il processo, per attenderne il completamento e per eliminarlo.

Affinché la temporizzazione di un processo in background sia indipendente da altri comandi, ogni processo in background viene eseguito in un ambiente ("sessione") di Windows PowerShell a se stante. Può però trattarsi di una connessione temporanea creata solo per eseguire il processo e quindi eliminata oppure di una sessione permanente (un PSSession) che è possibile usare 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. Per ottenere oggetti che rappresentano i processi avviati nel computer locale, è possibile usare anche il cmdlet Get-Job.

Per ottenere i risultati del processo, usare un comando Receive-Job. Se il processo non è stato completato, Receive-Job restituisce risultati parziali. È anche possibile usare il cmdlet Wait-Job per eliminare il prompt dei comandi fino al termine 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 relativo a ciascun cmdlet e vedere about_Jobs.

AVVIO DI PROCESSI IN BACKGROUND IN COMPUTER REMOTI

È possibile creare ed eseguire 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 tramite Start-Job o il parametro AsJob di Invoke-Command, il processo padre è un dirigente. Non esegue comandi né restituisce risultati. I comandi, in realtà, vengono eseguiti dai processi figlio (i processi avviati usando altri cmdlet potrebbero funzionare in modo diverso).

I processi figlio sono archiviati nella proprietà ChildJobs dell'oggetto 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 rispetto al processo padre, per cui i processi padre e figlio possono essere gestiti singolarmente o come un'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.

        C:\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 è stato introdotto in Windows PowerShell 3.0.

        C:\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 Windows PowerShell, usare la proprietà ChildJob del processo padre.

        C:\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 sul processo figlio, come mostrato nel comando seguente:

        C:\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 dirigente e 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 dirigente e 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 dirigente e 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 interrompe un processo padre, vengono interrotti tutti i processi figlio. Se si ottengono i risultati di un processo padre, si ottengono i risultati di tutti i processi figlio.

È comunque possibile gestire i processi figlio anche singolarmente. Questo è particolarmente utile quando si vuole esaminare un problema relativo a un processo o ottenere i risultati di uno solo tra molti processi figlio avviati usando il parametro AsJob di Invoke-Command (l'apice inverso (`) è il carattere di continuazione).

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

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

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

        CPS C:> $j | Format-List Name, ChildJobs

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

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

        C:\PS> $j

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

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

        PS C:\> 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 particolare processo figlio, come mostrato nel comando seguente:

        C:\PS> Receive-Job -Name Job6 -Keep | Format-Table ComputerName, DateTime -Auto

        ComputerName DateTime
        ------------ --------
        Server02     Thursday, March 13, 2008 4:16:03 PM

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

TIPI DI PROCESSO

Windows PowerShell supporta diversi tipi di processo per attività diverse. A partire da Windows PowerShell 3.0, gli sviluppatori possono scrivere "adattatori di origine dei processi" che aggiungono nuovi tipi di processo in Windows PowerShell e possono includerli nei moduli. Quando il modulo viene importato, il nuovo tipo di processo può essere usato nella sessione.

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

I tipi di processo personalizzati potrebbero essere nettamente diversi dai processi in background standard di Windows PowerShell. Ad esempio, i processi pianificati sono salvati su disco e non esistono solo in una particolare 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. In alcuni casi si usano i cmdlet dei processi standard, ad esempio Get-Job e Start-Job. In altri casi sono disponibili cmdlet specializzati che gestiscono solo un particolare tipo di processo. Per informazioni dettagliate sui tipi di processo personalizzato, vedere l'argomento della Guida relativo al tipo di processo.

Per trovare il tipo di un processo, usare il cmdlet Get-Job. Get-Job restituisce oggetti processo diversi per tipi di processo diversi. 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 disponibili in Windows PowerShell.

      Job Type         Description
      --------         -----------
      BackgroundJob    Started by using the Start-Job cmdlet.
      RemoteJob        Started by using the AsJob parameter of the 
                       Invoke-Command cmdlet.
      PSWorkflowJob    Started by using the AsJob parameter of a
                       workflow.
      PSScheduledJob   An instance of a scheduled job started by
                       a job trigger.
      CIMJob           Started by using the AsJob parameter of 
                       a cmdlet from a CDXML module.
      WMIJob           Started by using the AsJob parameter of 
                       a cmdlet from a WMI module.
      PSEventJob       Created by running Register-ObjectEvent 
                       and specifying an action with the Action
                       parameter.

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 riceverà 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. Viene quindi usato il cmdlet Get-Job per ottenere il processo. Get-Job non ottiene il processo pianificato, ma tutte le istanze avviate di quel processo.

    # Start a background job on the local computer.
    PS C:\> Start-Job -Name LocalData {Get-Process}

    Id   Name        PSJobTypeName   State   HasMoreData     Location   Command
    --   ----        -------------   -----   -----------     --------   -------
    2    LocalData   BackgroundJob   Running        True     localhost  Get-Process
    # Start a background job that runs on a remote computer.
    PS C:\> Invoke-Command -ComputerName Server01 {Get-Process} -AsJob -JobName RemoteData

    Id   Name        PSJobTypeName   State   HasMoreData     Location   Command
    --   ----        -------------   -----   -----------     --------   -------
    2    RemoteData  RemoteJob       Running        True     Server01   Get-Process
    # Create a scheduled job
    PS C:\>  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 a workflow. 
    PS C:\> workflow Test-Workflow {Get-Process}

    # Run the workflow as a job.
    PS C:\> Test-Workflow -AsJob -JobName TestWFJob

    Id   Name        PSJobTypeName   State   HasMoreData     Location   Command
    --   ----        -------------   -----   -----------     --------   -------
    2    TestWFJob   PSWorkflowJob   NotStarted     True     localhost  Get-Process
    # Get the jobs. The Get-Job command does not get scheduled jobs, but it gets
      instances of the scheduled job that are started.

    PS C:\> 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
    # To get scheduled jobs, use the Get-ScheduledJob cmdlet.
    PS C:\> 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-ScheduleJob