2016-02-29 30 views
6

Bất cứ ai cũng có thể đề xuất cách tôi có thể làm việc này ....Gọi Rscript từ tập lệnh shell linux

Tôi có một tập lệnh R mất vài phút để chạy và viết vài trăm dòng đầu ra. Tôi muốn viết một trình bao bọc shell script xung quanh tập lệnh R này sẽ khởi chạy kịch bản lệnh R trong nền, đưa đầu ra của nó vào một tệp và bắt đầu theo sau tệp đó. Nếu người dùng sau đó vào CTRL-C, tôi muốn điều đó để tiêu diệt kịch bản lệnh shell và lệnh đuôi nhưng không phải là tập lệnh R. Âm thanh đơn giản đúng không?

Tôi đã tạo một ví dụ đơn giản dưới đây, nhưng tôi không hiểu tại sao điều này không hiệu quả. Bất cứ khi nào tôi giết kịch bản lệnh shell, kịch bản lệnh R cũng bị giết mặc dù dường như đang chạy ẩn. Tôi đã cố gắng nohup, disown vv không thành công.

example.R

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

wrapper.sh

#!/bin/bash 

Rscript example.R > logfile & 

tail -f logfile 

Cảm ơn trước!

+0

Không, không phải vậy. Nếu tôi làm điều đó tôi nhận được hai công việc đang chạy trong nền và CNTL-C doen't giết một trong hai. Tôi muốn CNTL-C giết đuôi -f nhưng không phải Rscript. – David

+0

Tôi không có quyền truy cập vào 'R', nhưng tôi đã thử tập lệnh chính xác này với PHP và nó hoạt động như mô tả. Ctrl-C giết chết tập lệnh gốc nhưng để lại quá trình chạy nền. – miken32

Trả lời

3

Sau đây dường như làm việc trên máy tính Ubuntu của tôi:

#!/bin/bash 

setsid Rscript example.R > logfile.txt & 

tail -f logfile.txt 

Dưới đây là một số các quá trình có liên quan trước khi gửi 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 

và sau Ctrl+C, bạn có thể thấy rằng R vẫn đang chạy, nhưng wrapper.shtail đã bị giết:

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

Mặc dù phụ thêm lệnh Rscript [...] của bạn với & sẽ gửi nó tới nền, nó vẫn là một phần của quá trình tương tự nhóm, và do đó nhận SIGINT là tốt.


Tôi không chắc chắn nếu nó là ý định của bạn, nhưng kể từ khi bạn đang gọi tail -f, nếu không bị gián đoạn với Ctrl+c, shell của bạn đang chạy wrapper.sh sẽ tiếp tục treo ngay cả sau khi quá trình R hoàn tất. Nếu bạn muốn tránh điều này, sau đây nên làm việc,

#!/bin/bash 

setsid Rscript example.R > logfile.txt & 

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

nơi "$!" là id quá trình của quá trình nền cuối cùng thực hiện (các Rscript [...] cuộc gọi).

+1

Cảm ơn câu trả lời này, chính xác những gì tôi đang tìm kiếm. – David

Các vấn đề liên quan