2016-02-29 2 views
6

Может кто-нибудь подскажет, как я мог бы получить эту работу ....Вызов Rscript из Linux скрипт

У меня есть сценарий R, который занимает несколько минут, чтобы бежать и пишет несколько сотен строк вывода. Я хочу написать оболочку сценария оболочки вокруг этого R-скрипта, который запустит R-скрипт в фоновом режиме, выведет его вывод в файл и начнет следовать за дном этого файла. Если пользователь затем вводит CTRL-C, я хочу, чтобы он убил скрипт оболочки и команду хвоста, но не скрипт R. Звучит просто так?

Ниже я привел упрощенный пример, но я не понимаю, почему это не работает. Всякий раз, когда я убиваю скрипт оболочки, скрипт R также убивается, несмотря на то, что он явно работает в фоновом режиме. Я пробовал nohup, отрезал и т.д. без успеха.

example.R

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

wrapper.sh

#!/bin/bash 

Rscript example.R > logfile & 

tail -f logfile 

Заранее спасибо!

+0

Нет, это не то. Если я это сделаю, я получу две работы, которые работают в фоновом режиме, и CNTL-C не убивает ни одного из них. Я хочу, чтобы CNTL-C убил хвост -f, но не Rscript. – David

+0

У меня нет доступа к 'R', но я просто попробовал этот точный скрипт с PHP и работает так, как описано. Ctrl-C убивает родительский скрипт, но оставляет фоновый процесс запущенным. – miken32

ответ

3

Следующая, кажется, работает на моей Ubuntu машине:

#!/bin/bash 

setsid Rscript example.R > logfile.txt & 

tail -f logfile.txt 

Вот некоторые из соответствующих процессов перед отправкой 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 

и после Ctrl+C, вы можете см., что R все еще работает, но wrapper.sh и tail были убиты:

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

Хотя добавление вашей команды Rscript [...] с & будет отправить его на задний план, она все еще является частью одного и того же процесса группа, и, следовательно, получает SIGINT, а также.


Я не уверен, если это ваше намерение, но так как вы звоните tail -f, если не прерывались с Ctrl+c, вашей оболочкой, которая работает wrapper.sh будет продолжать висеть даже после того, как процесс R завершается. Если вы хотите, чтобы избежать этого, следующие должны работать,

#!/bin/bash 

setsid Rscript example.R > logfile.txt & 

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

где "$!" идентификатор процесса последнего фонового процесса Выполняется (Rscript [...] вызова).

+1

Спасибо за этот ответ, который делает именно то, что я искал. – David

Смежные вопросы