ARGOMENTO about_Remote_Jobs DESCRIZIONE BREVE Descrive come eseguire processi in background nei computer remoti. DESCRIZIONE DETTAGLIATA Un processo in background è un comando che viene eseguito in modo asincrono e non interagisce con la sessione corrente. Il prompt dei comandi viene visualizzato immediatamente ed è possibile continuare a utilizzare la sessione mentre il processo è in esecuzione. Per impostazione predefinita, i processi in background vengono eseguiti nel computer locale. Tuttavia, è possibile utilizzare diverse procedure per eseguire processi in background nei computer remoti. In questo argomento viene illustrato come eseguire un processo in background in un computer remoto. Per informazioni sull'esecuzione di processi in background in un computer locale, vedere about_Jobs. Per ulteriori informazioni sui processi in background, vedere about_Job_Details. PROCESSI IN BACKGROUND REMOTI È possibile eseguire processi in background nei computer remoti tramite tre metodi diversi. -- Avviare una sessione interattiva con un computer remoto e avviare un processo nella sessione interattiva. Le procedure sono analoghe all'esecuzione di un processo locale, sebbene tutte le azioni vengano eseguite nel computer remoto. -- Eseguire un processo in background in un computer remoto che restituisce i propri risultati al computer locale. Utilizzare questo metodo quando si desidera raccogliere i risultati dei processi in background e gestirli in una posizione centrale nel computer locale. -- Eseguire un processo in background in un computer remoto che mantiene i propri risultati nel computer remoto. Utilizzare questo metodo quando i dati del processo sono gestiti in modo più sicuro nel computer da cui provengono. AVVIARE UN PROCESSO IN BACKGROUND IN UNA SESSIONE INTERATTIVA È possibile avviare una sessione interattiva con un computer remoto e quindi avviare un processo in background durante la sessione interattiva. Per ulteriori informazioni sulle sessioni interattive, vedere about_Remote e Enter-PSSession. La procedura di avvio di un processo in background in una sessione interattiva è pressoché identica alla procedura di avvio di un processo in background nel computer locale. Tuttavia, tutte le operazioni vengono eseguite nel computer remoto, anziché nel computer locale. PASSAGGIO 1: ENTER-PSSESSION Utilizzare il cmdlet Enter-PSSession per avviare una sessione interattiva con un computer remoto. È possibile utilizzare il parametro ComputerName di Enter-PSSession per stabilire una connessione temporanea per la sessione interattiva. In alternativa, è possibile utilizzare il parametro Session per eseguire la sessione interattiva nella sessione Windows PowerShell (PSSession). Il comando seguente avvia una sessione interattiva nel computer Server01. C:\PS> Enter-PSSession -computername Server01 Il prompt dei comandi viene modificato per indicare la connessione al computer Server01. Server01\C:> PASSAGGIO 2: START-JOB Per avviare un processo in background nella sessione, utilizzare il cmdlet Start-Job. Il comando seguente esegue un processo in background che ottiene gli eventi del registro eventi di Windows PowerShell del computer Server01. Il cmdlet Start-Job restituisce un oggetto che rappresenta il processo. Questo comando salva l'oggetto processo nella variabile $job. Server01\C:> $job = start-job -scriptblock {get-eventlog "Windows PowerShell"} Mentre il processo è in esecuzione, è possibile utilizzare la sessione interattiva per eseguire gli altri comandi, includendo gli altri processi in background. Tuttavia, è necessario tenere la sessione interattiva aperta finché non viene completato il processo. Se si termina la sessione, il processo viene interrotto e i risultati vengono persi. PASSAGGIO 3: GET-JOB Per sapere se il processo è completo, visualizzare il valore della variabile job o utilizzare il cmdlet Get-Job per ottenere il processo. Il comando seguente utilizza il cmdlet Get-Job per visualizzare il processore. Server01\C:> get-job $job SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Complete True localhost get-eventlog "Windows PowerShell" L'output di Get-Job mostra che il processo è in esecuzione nel computer "localhost" poiché è stato avviato ed è in esecuzione nello stesso computer (in questo caso, Server01). PASSAGGIO 4: RECEIVE-JOB Per ottenere i risultati del processo, utilizzare il cmdlet Receive-Job. È possibile visualizzare i risultati nella sessione interattiva oppure salvarli in un file nel computer remoto. Il comando seguente ottiene i risultati del processo nella variabile $job. Il comando utilizza l'operatore di reindirizzamento (>) per salvare i risultati del processo nel file PsLog.txt file nel computer Server01. Server01\C:> receive-job $job > c:\logs\PsLog.txt PASSAGGIO 5: EXIT-PSSESSION Per terminare la sessione interattiva, utilizzare il cmdlet Exit-PSSession. Il prompt dei comandi viene modificato per mostrare che si è tornati alla sessione originale nel computer locale. Server01\C:> Exit-PSSession C:\PS> PASSAGGIO 6: INVOKE-COMMAND: GET CONTENT Per visualizzare in qualsiasi momento il contenuto del file PsLog.txt nel computer Server01, avviare un'altra sessione interattiva o eseguire un comando remoto. Questo tipo di comando viene eseguito in modo migliore in una sessione PSSession (connessione permanente) in caso si desideri utilizzare più comandi per analizzare e gestire i dati del file PsLog.txt. Per ulteriori informazioni sulle sessioni PSSession, vedere about_PSSessions. I comandi seguenti utilizzando il cmdlet New-PSSession per creare una sessione PSSession connessa al computer Server01 e utilizzano il cmdlet Invoke-Command per eseguire un comando Get-Content nella sessione PSSession per visualizzare il contenuto del file. C:\PS> $s = new-pssession -computername Server01 C:\PS> invoke-command -session $s -scriptblock {get-content c:\logs\pslog.txt} AVVIARE UN PROCESSO REMOTO CHE RESTITUISCE I RISULTATI AL COMPUTER LOCALE (ASJOB) Per avviare un processo in background in un computer remoto che restituisce i risultati del comando al computer locale, utilizzare il parametro AsJob di un cmdlet quale il cmdlet Invoke-Command. Quando si utilizza il parametro AsJob, l'oggetto processo viene in realtà creato nel computer locale, anche se il processo viene eseguito nel computer remoto. Al completamento del processo, i risultati vengono restituiti al computer locale. È possibile utilizzare i cmdlet che contengono il nome Job (cmdlet Job) per gestire qualsiasi processo creato da qualsiasi cmdlet. Molti dei cmdlet che dispongono di parametri AsJob non utilizzano la comunicazione remota di Windows PowerShell ed è pertanto possibile utilizzarli anche in computer non configurati per la comunicazione remota e che non soddisfano i requisiti per la comunicazione remota. PASSAGGIO 1: INVOKE-COMMAND -ASJOB Il comando seguente utilizza il parametro AsJob di Invoke-Command per avviare un processo in background nel computer Server01. Il processo esegue un comando Get-Eventlog che consente di ottenere gli eventi presenti nel registro eventi di sistema. È possibile utilizzare il parametro JobName per assegnare un nome visualizzato al processo. invoke-command -computername Server01 -scriptblock {get-eventlog system} -asjob I risultati del comando sono analoghi all'output di esempio seguente. SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Running True Server01 get-eventlog system Quando viene utilizzato il parametro AsJob, Invoke-Command restituisce lo stesso tipo di oggetto processo restituito da Start-Job. È possibile salvare l'oggetto processo in una variabile oppure utilizzare un comando Get-Job per ottenere il processo. Notare che il valore della proprietà Location mostra che il processo viene eseguito nel computer Server01. PASSAGGIO 2: GET-JOB Per gestire un processo avviato mediante il parametro AsJob del cmdlet Invoke-Command, utilizzare i cmdlet Job. Poiché l'oggetto processo che rappresenta il processo remoto si trova nel computer locale, non è necessario eseguire comandi remoti per gestire il processo. Per determinare se il processo è completo, utilizzare un comando Get-Job. Il comando seguente ottiene tutti processi avviati nella sessione corrente. get-job Poiché il processo remoto è stato avviato nella sessione corrente, lo si ottiene con un comando Get-Job locale. La proprietà State dell'oggetto processo mostra che il comando è stato completato correttamente. SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 1 Job1 Completed True Server01 get-eventlog system PASSAGGIO 3: RECEIVE-JOB Per ottenere i risultati del processo, utilizzare il cmdlet Receive-Job. Poiché i risultati del processo sono restituiti automaticamente al computer in cui l'oggetto processo risiede, è possibile ottenere i risultati con un comando Receive-Job locale. Il comando seguente utilizza il cmdlet Receive-Job per ottenere i risultati del processo. Utilizza l'ID sessione per identificare il processo. Questo comando salva i risultati del processo nella variabile $results. È anche possibile reindirizza i risultati in un file. $results = receive-job -id 1 AVVIARE UN PROCESSO REMOTO CHE MANTIENE I RISULTATI NEL COMPUTER REMOTO Per avviare un processo in background in un computer remoto che mantiene i risultati del comando nel computer remoto, utilizzare il cmdlet Invoke-Command per eseguire un comando Start-Job in un computer remoto. È possibile utilizzare questo metodo per eseguire processi in background in più computer. Quando si esegue un comando Start-Job in modalità remota, l'oggetto processo viene creato nel computer remoto e i risultati del processo vengono mantenuti nel computer remoto. Dalla prospettiva del processo, tutte le operazioni sono locali. Si eseguono comandi in modalità remota esclusivamente per gestire un processo locale nel computer remoto. PASSAGGIO 1: INVOKE-COMMAND START-JOB Utilizzare il cmdlet Invoke-Command per eseguire un comando Start-Job in un computer remoto. Questo comando richiede una sessione PSSession (connessione permanente). Se si utilizza il parametro ComputerName di Invoke-Command per stabilire una connessione temporanea, il comando Invoke-Command è considerato completo quando viene restituito l'oggetto processo. Di conseguenza, la connessione temporanea viene chiusa e il processo viene annullato. Il comando seguente utilizza il cmdlet New-PSSession per creare una sessione PSSession connessa al computer Server01. Il comando salva la sessione PSSession nella variabile $s. $s = new-pssession -computername Server01 Il comando successivo utilizza il cmdlet Invoke-Command per eseguire un comando Start-Job nella sessione PSSession. Il comando Start-Job e il comando Get-Eventlog sono racchiusi tra parentesi graffe. invoke-command -session $s -scriptblock {start-job -scriptblock {get-eventlog system}} I risultati sono analoghi all'output di esempio seguente. Id Name State HasMoreData Location Command -- ---- ----- ----------- -------- ------- 2 Job2 Running True Localhost get-eventlog system Quando si esegue un comando Start-Job in modalità remota, Invoke-Command restituisce lo stesso tipo di oggetto processo restituito da Start-Job. È possibile salvare l'oggetto processo in una variabile oppure utilizzare un comando Get-Job per ottenere il processo. Notare che il valore della proprietà Location mostra che il processo è in esecuzione nel computer locale, denominato "LocalHost" anche se il processo è in esecuzione sul computer Server01. Poiché l'oggetto processo viene creato nel computer Server01 e il processo viene eseguito nello stesso computer, viene considerato un processo in background locale. PASSAGGIO 2: INVOKE-COMMAND GET-JOB Per gestire un processo in background remoto, utilizzare i cmdlet Job. Poiché l'oggetto processo si trova nel computer remoto, è necessario eseguire comandi remoti per ottenere, arrestare, attendere o recuperare i risultati del processo. Per verificare se il processo è completo, utilizzare un comando Invoke-Command per eseguire un comando Get-Job nella sessione PSSession connessa al computer Server01. invoke-command -session $s -scriptblock {get-job} Il comando restituisce un oggetto processo. La proprietà State dell'oggetto processo mostra che il comando è stato completato correttamente. SessionId Name State HasMoreData Location Command --------- ---- ----- ----------- -------- ------- 2 Job2 Completed True LocalHost get-eventlog system PASSAGGIO 3: INVOKE-COMMAND RECEIVE-JOB Per ottenere i risultati del processo, utilizzare il cmdlet Invoke-Command per eseguire un comando Receive-Job nella sessione PSSession connessa al computer Server01. Il comando seguente utilizza il cmdlet Receive-Job per ottenere i risultati del processo. Utilizza l'ID sessione per identificare il processo. Questo comando salva i risultati del processo nella variabile $results. Utilizza il parametro Keep di Receive-Job per mantenere nel computer remoto il risultato nella cache del processo. $results = invoke-command -session $s -scriptblock {receive-job -sessionid 2 -keep} È anche possibile reindirizzare i risultati a un file nel computer locale o remoto. Il comando seguente utilizza un operatore di reindirizzamento per salvare i risultati in un file nel computer Server01. invoke-command -session $s -command {receive-job -sessionid 2 > c:\logs\pslog.txt} VEDERE ANCHE about_Jobs about_Job_Details about_Remote Invoke-Command Start-Job Get-Job Wait-Job Stop-Job Remove-Job New-PSSession Enter-PSSession Exit-PSSession