2009-06-25 12 views
5

Sto cercando di avviare in background un lavoro su una macchina remota e ottenere il suo PID in modo che possa essere eliminato in seguito. Quello che ho trovato finora è il seguente:Avvio in remoto del pid di un lavoro

#!/bin/bash 

IP=xxx.xxx.xxx.xx 
REMOTE_EXEC="ssh $IP -l root" 

# The following does NOT work, I am trying to get the PID of the remote job 
PID=`$REMOTE_EXEC 'vmstat 1 1000 > vmstat.log & ; echo $!'` 

# Launch apache benchmark 
ab -n 10 http://$IP/ 

$REMOTE_EXEC "kill $PID" 

Sfortunatamente non funziona. Sto ottenendo un

bash: syntax error near unexpected token `;' 

ma non so quale sarebbe la sintassi corretta.

+0

Semplicemente: 'vmstat 1 1000> vmstat.log &; echo $! ' non ha nemmeno localmente. Dai un'occhiata a questo. –

+0

Sì, lo so. Quindi ho bisogno di una correzione per 'vmstat 1 1000> vmstat.log &; echo $! ' o ho bisogno di ottenere il PID del lavoro remoto attraverso qualche altro meccanismo. – davitenio

+0

@davitenio Il PID non termina come PID del comando ssh locale, non del comando vmstat remoto? –

risposta

3

Hai ottenuto l'errore, perché tu ';' è ridondante, prova 'vmstat 1 1000> vmstat.log & echo $!'

Ma non sono sicuro che funzionerà, perché dopo aver effettuato il logout, il processo riceverà SIGHUP. Guarda nohup (1).

+0

Funziona, anche senza usare nohup. Grazie! – davitenio

+0

Sì, hai ragione ... Può essere, succede, perché in questo caso ssh non ti "fa il login" (da ssh (1): "Se il comando è specificato, viene eseguito sull'host remoto anziché su un login shell. "). – dmitri

2

Prova che circonda il comando in background tra parentesi graffe:

PID=`$REMOTE_EXEC '{ vmstat 1 1000 > vmstat.log & }; echo $!'` 
0

Nel caso in cui si utilizza deboli citando, è necessario fuggire $! come la seguente:

$REMOTE_EXEC "{ vmstat 1 1000 > vmstat.log & }; echo \$!" 

o

P=`$REMOTE_EXEC "{ vmstat 1 1000 > vmstat.log & }; echo \\\$!"` 
+0

sto ottenendo -bash:!! ": Evento non trovato con ssh host '{eseguibile & }; echo \ $' –

+0

Potrebbe dipendere dal vostro sistema operativo Funziona perfettamente su Ubuntu 12 e più alto se si sta utilizzando.. citazione debole, prova a scappare! simbolo anche come descritto qui http://serverfault.com/questions/208265/what-is-bash-event-non-found o non usare le virgolette deboli. – Rom098

+0

Ho trovato il problema - era che "l'espansione della cronologia" era abilitata: se ho usato quella linea all'interno di uno script, ha funzionato correttamente, ma se l'ho eseguita direttamente da un terminale, ha fallito. Se spengo l'espansione della cronologia con "set + H", allora funziona correttamente dal terminale. –

Problemi correlati