2010-03-31 225 views
1

我想設置一個簡單的計時器,從Rails應用程序開始。該計時器應等待其持續時間,然後啓動一個shell腳本,該腳本將啓動./script/runner並完成初始請求。我需要腳本/跑步者,因爲我需要訪問ActiveRecord。unix at命令將變量傳遞給shell腳本?

下面是我的Rails測試線

output = `at #{(Time.now + 60).strftime("%H:%M")} < #{Rails.root}/lib/parking_timer.sh STRING_VARIABLE` 
return render :text => output 

然後我parking_timer.sh看起來像這樣

#!/bin/sh    
~/PATH_TO_APP/script/runner -e development ~/PATH_TO_APP/lib/ParkingTimer.rb $1 
echo "All Done"  

最後,ParkingTimer.rb讀取與

ARGV.each do|a| 
    puts "Argument: #{a}" 
end 

的傳遞變量問題在於Unix命令「at」似乎不喜歡變量,只想處理filena MES。我要麼得到取決於如何我位置的兩個錯誤之一「S

如果我把引號的右手邊,像這樣

...‘〜/ PATH_TO_APP/lib中/ parking_timer.sh字符串變量’

我得到的,

-bash:〜/ PATH_TO_APP/lib中/ parking_timer.sh字符串變量:沒有這樣的文件或目錄

II假牛逼他引用了,我得到的,

在:亂碼時間

這一切發生上運行Rails的2.3 &紅寶石在Mac OS 10.6盒1.8.6

我已經搞砸圍繞w/BackgrounDrb,並決定其總PITA。我需要能夠在任何時候取消工作。

回答

1

稍微玩了一下irb,我找到了這個。

反向運算符在ruby完成任何必要的解釋之後調用shell。對於我的測試情況下,strace輸出看起來是這樣的:

execve("/bin/sh", ["sh", "-c", "echo at 12:57 < /etc/fstab"], [/* 67 vars */]) = 0 

因爲我們知道它在做什麼,讓我們看看你的命令將如何執行的:

/bin/sh -c "at 12:57 < RAILS_ROOT/lib/parking_timer.sh STRING_VARIABLE" 

這看起來非常奇數。你真的想管parking_timer.sh,腳本,作爲at命令的輸入嗎?

你可能最終需要的是這樣的:

/bin/sh -c "RAILS_ROOT/lib/parking_timer.sh STRING_VARIABLE | at 12:57" 

因此,parking_timer.sh命令的輸出將成爲輸入at命令。

所以,請嘗試以下操作:

output = `#{Rails.root}/lib/parking_timer.sh STRING_VARIABLE | at #{(Time.now + 60).strftime("%H:%M")}` 
return render :text => output 

您可以隨時使用stracetruss,看看發生了什麼。例如:

strace -o strace.out -f -ff -p $IRB_PID 

grep '^exec' strace.out*然後看到正在執行的命令,其中。

+0

我能夠得到它至少編譯和運行,而不會隨身攜帶垃圾, 'at -t \「#{(Time.now + 60).strftime(」%m%d%H% M 「)} \」< 「#{Rails.root} /lib/parking_timer.sh」, 「4」' 然而,它不通過可變而直接調用腳本,它的作用。 SH parking_timer.sh 4 這似乎並不重要,如果我身邊有4與否或周圍的腳本路徑引號。 – Andrew 2010-03-31 18:42:46

+0

我做了一些調查後做了一些重大修改。 – 2010-03-31 20:11:31

+0

謝謝,明白了這個 輸出='#{工作} Rails.root /腳本/亞軍-e發展#{} Rails.root#/lib/ParkingTimer.rb {4.to_s} | at -t#{(Time.now + 60).strftime(「%m%d%H%M」)}' 它完全繞過了.sh腳本,但又如此。 輸出仍然是空白,這可能會導致我在路上遇到問題,(如果需要,找不到要刪除的作業)。 – Andrew 2010-03-31 20:45:30

相關問題