11/09/2009

PowerShell 2.0 - Cosa c'è di nuovo?

A cura di Efran Cobisi


Pagina 2 di 4

Job in background


Seconda delizia delle nuove funzionalità di PowerShell 2.0, la capacità di eseguire job in background colma uno degli ultimi gap esistenti tra le shell *nix e quella Microsoft.
Un background job (o semplicemente Job, per gli amici) è uno script o un cmdlet lanciato in modalità asincrona (senza, quindi, bloccare la shell) all’interno del sistema locale o di un sistema remoto; la grande utilità di questa funzione è dovuta al fatto che è ora possibile lanciare diversi comandi contemporaneamente ed in parallelo a fronte, magari, di più sistemi remoti e intanto fare dell’altro. PowerShell si occuperà di orchestrare per noi l’esecuzione dei job e fornircene il risultato qualora lo richiedessimo.

Se volessimo, ad esempio, recuperare la lista dei processi locali in parallelo alla sessione corrente potremmo usufruire del cmdlet Start-Job, uno dei nuovi cinque cmdlet (Start-Job, Stop-Job, Wait-Job, Get-Job, Receive-Job e Remove-Job) messi a disposizione della shell per gestire i job in background:

$job = Start-Job { Get-Process }

L’esecuzione del comando è pressochè istantanea e non interferisce con la sessione originale della shell. Se ispezionassimo l’oggetto creato da Start-Job, vedremmo che si tratta di un’istanza del tipo PSRemotingJob e che dispone di proprietà in grado di dirci se il job è in esecuzione, se ci sono dati da ricevere, qual è il sistema di destinazione del comando e così via.

Per ottenere il risultato del job utilizziamo il cmdlet Receive-Job, fornendo il job di interesse:

Receive-Job $job

Scenari più complessi, dove sono ritornati più oggetti dal job (nel caso di Get-Process si tratta di un array di informazioni di processo ma l’array è pure sempre uno), richiedono il test della proprietà HasMoreData del job, che indica se è possibile richiamare ulteriormente Receive-Job a fronte del job in questione, quasi fosse uno stream di oggetti.

La gestione di background job su sistemi remoti si basa su PowerShell Remoting ed in qualche modo completa quest’ultima funzionalità; eseguire un background job tramite PowerShell Remoting richiede lo switch –AsJob del cmdlet Invoke-Command, visto in precedenza:

$jobRemoting = Invoke-Command SRV01,SRV02 $command –AsJob
Pagina 2 di 4
Commenti

Nessun commento disponibile.