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