2016-09-08 6 views
1

enter image description here ich ein Ruby-Skript haben in ~/scri.rbRuby-Skript cron nicht funktioniert

File.open('~/newfile.txt', 'a+') do |f| 
    f << "hi..\n" 
end 

Ich habe einen cron Tab wie diese

* * * * * bash -lc 'ruby ~/scri.rb' >> /var/log/syslog 

Wenn ich die Protokolle in/var überprüfen/log/syslog ich sehe Einträge wie diese

Sep 8 14:49:01 user1acer CRON[26063]: (user1) CMD (bash -lc 'ruby ~/scri.rb' >> /var/log/syslog) 
Sep 8 14:50:01 user1acer CRON[27502]: (user1) CMD (bash -lc 'ruby ~/scri.rb' >> /var/log/syslog) 
Sep 8 14:51:01 user1acer CRON[29006]: (user1) CMD (bash -lc 'ruby ~/scri.rb' >> /var/log/syslog) 
Sep 8 14:52:01 user1acer CRON[30425]: (user1) CMD (bash -lc 'ruby ~/scri.rb' >> /var/log/syslog) 
Sep 8 14:53:01 user1acer CRON[31846]: (user1) CMD (bash -lc 'ruby ~/scri.rb' >> /var/log/syslog) 

Aber wenn ich die newfile.txt Datei überprüfen ich sehe nichts drin.

Fehle ich hier etwas?

+0

Sie müssen vollständige Pfade in Cron verwenden. Schreiben Sie statt '~/newfile.txt' '/ home/your_user/newfile.txt', damit cron weiß, wo sich die Datei befindet. In der Tat haben Sie wahrscheinlich die Datei in '/', die das Home-Verzeichnis von root ist. – fedorqui

+0

newfile.txt befindet sich im Home-Verzeichnis. – RamanSM

+0

OK, Ruby kenne ich nicht. Wenn Sie diese Datei zum Anhängen von Inhalt öffnen möchten, müssen Sie Cron den vollständigen Pfad mitteilen. Probieren Sie es mit '/ home/...' anstatt mit '~' aus, wie schon gesagt. – fedorqui

Antwort

2

Dies hat eigentlich nichts mit Cron zu tun. ~ ist eine Eigenschaft der Shell, Ruby weiß nicht, was es ist. Nur einige Methoden in Ruby befassen sich mit ~, z.B. File::expand_path. Ruby versucht also buchstäblich, eine Datei namens newfile.txt im Verzeichnis ~ im aktuellen Arbeitsverzeichnis zu öffnen. Probieren Sie es selbst aus: Erstellen Sie ein leeres Verzeichnis mit dem Namen ~ in Ihrem Home-Verzeichnis, und nach 1 Minute sollten Sie eine neue Datei namens newfile.txt mit dem Inhalt hi.. darin finden.

Es gibt ein paar Möglichkeiten, dies zu beheben, werde ich es Ihnen überlassen, welche zu benutzen:

File.open(File.expand_path('~/newfile.txt'), 'a') do |f| end 
File.open(File.join(Dir.home, 'newfile.txt'), 'a') do |f| end 

[Anmerkung: Wenn Sie nur bis zum Ende der Datei angehängt werden sollen, nicht bewegen oder lesen, a ist genug, Sie a+ nicht brauchen]

finden Sie in der Dokumentation für File::expand_path (fett Hervorhebung von mir).

Konvertiert einen Pfadnamen in einen absoluten Pfadnamen. Relative Pfade werden vom aktuellen Arbeitsverzeichnis des Prozesses referenziert, es sei denn dir_string ist angegeben, in diesem Fall wird es als Startpunkt verwendet. Der angegebene Pfadname kann mit einem "~" beginnen, der zum Basisverzeichnis des Prozesseigentümers erweitert wird (die Umgebungsvariable HOME muss korrekt festgelegt werden). "~ user" wird zum Home-Verzeichnis des benannten Benutzers erweitert.

+0

Der Schlüssel hier ist, dass die Umgebungsvariable HOME nicht gesetzt ist, wenn ein Skript über cron ausgeführt wird. – fedorqui

+0

Ah. Ich habe nicht einmal daran gedacht, so weit zu forschen, weil das Skript des OP bereits gebrochen war, ohne dass Cron überhaupt involviert war. Trifft das auch zu, wenn eine Login-Shell von cron ausgeführt wird? Ich dachte, es wäre die Aufgabe der Login-Shell, $ HOME zu setzen, nicht Cron. –

+0

In der Tat habe ich mich geirrt, nur überprüft es tun '* * * * * echo" $ HOME ">/tmp/myhome'. Was wahr ist, ist, dass "env" weit weniger Werte enthält als eine normale Sitzung. Natürlich wird '~' von Cron nicht verstanden, daher muss ein gültiger Pfad angegeben werden. – fedorqui