2017-11-14 10 views
0

Ich benutze Ubuntu 16.04.3 LTS in der Cloud. Wenn ich ein Programm von der Kommandozeile mit Rscript starte, läuft alles wie erwartet. Wenn ich dasselbe Programm mit Rscript über Cron ausführe, scheint jedoch, dass meine .Rprofile-Datei nicht aufgerufen wird. Ich habe ein kleines Programm geschrieben, um dieses Problem zu demonstrieren:.Rprofile nicht unter Cron aufgerufen

test_cron = function() { 
    #The next 3 lines are base R. 
    sink('~/test_cron.out') 
    on.exit(sink()) 
    cat('The date and time are:', as.character(Sys.time()), '\n') 
    #Now try to access a personal option, set by .Rprofile. 
    root = getOption('root') 
    cat('Option root:', root, '\n') 
} 
test_cron() 

Ich betreiben diese von der Kommandozeile mit folgendem Befehl:

Rscript test_cron.r 

Die cron_test.out Datei enthält folgende Komponenten:

The date and time are: 2017-11-14 06:15:46 
Option root: /home/ubuntu/_algi/ 

Die relevante Zeile in crontab ist wie folgt:

20 6 * * * /usr/bin/Rscript ~/test_cron.r 

Wenn diese von cron ausgeführt wird, cron_test.out enthält folgende Komponenten:

The date and time are: 2017-11-14 06:20:01 
Option root: 

das Programm offenbar, wenn sie von cron, nicht meine persönliche Option 'root' zugreifen können. Dies ist einer unter einer Reihe von Experimenten, die ich ausgeführt habe, die mich davon überzeugen, dass .Rprofile nicht unter cron aufgerufen wird. Gibt es eine Lösung dafür?

Hinweis: Die Umgebungsvariable R_PROFILE_USER verweist auf meine .Rprofile-Datei. Anscheinend ignoriert Rscript unter cron es.

Antwort

1

standardmäßig für R aussieht und läuft .Rprofile Dateien in den drei Standorten in einer bestimmten Reihenfolge, die sind:

  • R_HOME: das Verzeichnis, in dem R installiert ist
  • HOME: der Home-Verzeichnis des Benutzers
  • des R aktuellen Arbeitsverzeichnis

.Rprofile in Ihnen aktuelle Projekt/wd außer Kraft setzen .Rprofile in HOME und R_HOME und .Rprofile in HOME R_HOME außer Kraft setzen wird.

Um ein projektspezifisches Start-Skript zu erstellen, erstellen Sie einfach eine .Rprofile-Datei im Stammverzeichnis des Projekts.

Es sieht in Ihrem Fall so aus, dass R eine andere .Rprofile-Datei verwendet, wenn ein Skript von cron gestartet wird, als ein Skript über die Befehlszeile zu starten.

+0

Ich habe meine Frage bearbeitet, um festzustellen, dass die Umgebungsvariable R_PROFILE_USER auf meine .Rprofile-Datei verweist. Vermutlich ignoriert Rscript unter cron dies. In jedem Fall bietet Ihre Antwort, obwohl sie von pädagogischem Interesse ist, keine Lösung für das Problem, oder wenn ich es nicht sehe. – Argent

0

Es zeigt sich, dass Cron die Umgebung des Benutzers nicht lädt. Dies hat endlose Verwirrung und Angst verursacht, ohne eine allgemein akzeptierte Lösung. Siehe zum Beispiel

https://serverfault.com/questions/673480/load-users-environment-variables-in-a-cronjob 
https://stackoverflow.com/questions/15557777/cron-job-does-not-get-the-environment-variables-set-in-bashrc 
https://stackoverflow.com/questions/2229825/where-can-i-set-environment-variables-that-crontab-will-use 
https://unix.stackexchange.com/questions/27289/how-can-i-run-a-cron-command-with-existing-environmental-variables 

Ein eng verwandtes Problem ist, dass Bashrc nur in einer interaktiven Shell ausgeführt werden ::

https://unix.stackexchange.com/questions/257571/why-does-bashrc-check-whether-the-current-shell-is-interactive 

Meine Lösung ist ein Shell-Skript zu schreiben, in dem ich die notwendige Set Umgebungsvariablen, dann führen Sie mein Programm:

Nachdem das Skript ausführbar gemacht wurde, läuft es erfolgreich unter Crontab.

Verwandte Themen