2010-03-31 119 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

相关问题