2016-02-29 19 views
6

Qualcuno può suggerire come potrei ottenere questo lavoro ....Chiamata rscript da script di shell linux

Ho uno script in R che richiede diversi minuti per correre e scrive a poche centinaia di righe di output. Voglio scrivere un wrapper di shell shell attorno a questo script R che lancerà lo script R in background, ne canalizzerà l'output in un file e inizierà a seguire il fondo di quel file. Se l'utente inserisce CTRL-C, voglio che questo uccida lo script della shell e il comando tail ma non lo script R. Sembra semplice vero?

Ho prodotto un esempio semplificato di seguito, ma non capisco perché questo non funzioni. Ogni volta che uccido lo script della shell, anche lo script R viene ucciso nonostante sia apparentemente in esecuzione in background. Ho provato nohup, disown etc senza successo.

example.R

for(i in 1:1000){ 
    Sys.sleep(1) 
    print(i) 
} 

wrapper.sh

#!/bin/bash 

Rscript example.R > logfile & 

tail -f logfile 

Grazie in anticipo!

+0

No, non è quello. Se lo faccio, ottengo due lavori in esecuzione in background e CNTL-C non li uccide. Voglio che CNTL-C uccida tail -f ma non Rscript. – David

+0

Non ho accesso a 'R', ma ho appena provato questo script esatto con PHP e funziona come descritto. Ctrl-C uccide lo script genitore ma lascia in esecuzione il processo in background. – miken32

risposta

3

Quanto segue sembra funzionare sulla mia macchina Ubuntu:

#!/bin/bash 

setsid Rscript example.R > logfile.txt & 

tail -f logfile.txt 

Ecco alcuni dei processi rilevanti prima di inviare SIGINT-wrapper.sh:

5361 pts/10 00:00:00 bash 
6994 ?  00:00:02 update-notifier 
8519 pts/4 00:00:00 wrapper.sh 
8520 ?  00:00:00 R 
8521 pts/4 00:00:00 tail 

e dopo Ctrl+C, è possibile vedere che R è ancora in esecuzione, ma wrapper.sh e tail sono stati uccisi:

5361 pts/10 00:00:00 bash 
6994 ?  00:00:02 update-notifier 
8520 ?  00:00:00 R 

Anche se aggiungendo il vostro comando Rscript [...] con & invierà allo sfondo, è ancora parte dello stesso processo gruppo, e quindi riceve SIGINT pure.


io non sono sicuro se fosse vostra intenzione, ma dal momento che si sta chiamando tail -f, se non viene interrotto con Ctrl+c, la shell che esegue wrapper.sh continuerà ad appendere anche dopo il completamento del processo di R. Se si vuole evitare questo, il seguente dovrebbe funzionare,

#!/bin/bash 

setsid Rscript example.R > logfile.txt & 

tail --pid="$!" -f logfile.txt 

dove "$!" è l'ID di processo dell'ultimo processo in background eseguito (il Rscript [...] chiamata).

+1

Grazie per questa risposta che fa esattamente quello che stavo cercando. – David

Problemi correlati