对于我来说,这可能是面对面的经历之一,但谦虚是一种美德,而且我已经没有线索...这篇文章的摘要是我需要发现什么可能在我们的核心网站之外调用每日ruby运行。
我们在后端使用MySQL的Apache / Passenger上使用Ruby 1.9.3-p484 / Rails 3.2.17在Ubuntu 10.04 LTS上运行。我们使用resque,god和passenger作为我们堆栈的一部分。我已经使用继承的代码库在Ruby中编程了大约4-5个月(所以我当然还在学习),但是已经使用Linux(不停用了很多年)。
我有一个模型的类方法,似乎每天都会调用它来更新我们的模型内容(我可以看到它在Ruby日志中执行),但我不能告诉它调用它的是什么。它似乎不在Apache / Passenger堆栈中,因为它似乎是在一个只出现执行例程然后退出的进程下运行,提示一个cron作业。我已经查看了Resque.enqueues,查看了app / jobs目录,并查看了/ etc / cron文件。我甚至以相当高的级别为所调用方法的名称设置了文件系统。 Gemfile不会建议除Resque之外的任何其他后台处理设施。
我已经打了一个"来电"用于记录的行,但它当然只显示Ruby中的调用堆栈,虽然它确实证明该过程只是用于运行该方法(PID不会出现" ps aux"当我稍后检查):
"(eval):1:in `<top (required)>'",
"/var/www/myapp/shared/bundle/ruby/1.9.1/gems/railties-3.2.17/lib/rails/commands/runner.rb:54:in `eval'",
"/var/www/myapp/shared/bundle/ruby/1.9.1/gems/railties-3.2.17/lib/rails/commands/runner.rb:54:in `<top (required)>'",
"/var/www/myapp/shared/bundle/ruby/1.9.1/gems/railties-3.2.17/lib/rails/commands.rb:64:in `require'",
"/var/www/myapp/shared/bundle/ruby/1.9.1/gems/railties-3.2.17/lib/rails/commands.rb:64:in `<top (required)>'",
"./script/rails:6:in `require'", "./script/rails:6:in `<main>'"
我的问题是(1)是否有其他一些我应该关注的调度工具(可能是我不熟悉的Ruby工具),或者(2)有没有办法让我添加来自在Ruby中(比如说,就像我用&#34;调用者&#34;),它会显示调用命令是什么?
更新(2014年4月27日):
基于@BasileStarynkevitch提供的Process.ppid
线索(谢谢!),我能够找到调用我正在使用以下代码搜索的方法的命令
Rails.logger.warn "pid = >#{Process.pid}<, parent pid = >#{Process.ppid}<"
_cmd = "cat /proc/#{Process.pid}/cmdline"
Rails.logger.warn "current = >#{`#{_cmd}`}<" rescue nil
_cmd = "cat /proc/#{Process.ppid}/cmdline"
Rails.logger.warn "parent = >#{`#{_cmd}`}<" rescue nil
日志检查了从bash脚本启动Rails runner脚本:
Apr 27 13:12:22 svrprod rails[26730]: pid = >26730<, parent pid = >26729<
Apr 27 13:12:22 svrprod rails[26730]: current = >ruby./script/rails runner Model.method<
Apr 27 13:12:22 svrprod rails[26730]: parent = >/bin/sh -c(cd /var/www/myapp/current && bash -l -c "RAILS_ENV=production ./script/rails runner 'Model.method'" > /tmp/method_output 2>&1)<
不幸的是,这让我回过头来尝试运行grep来发现这个脚本调用它的位置。它确实支持cron以某种方式触发它的概念,但在我找到脚本之前,我回到原点。
更新2(2014年4月27日):
好吧,每天都要学习新东西。这是一个cron工作,但我现在还没有/var/spool/cron
(我更专注于/etc/cron
)。这就是rails runner
工作的触发器所在的地方。但我了解了Process.ppid
和rails runner
以及/var/spool/cron
。谢谢你的帮助。
答案 0 :(得分:1)
有趣的问题,我实际上也想过这个问题。
查看有关输出当前堆栈跟踪的问题,不带引发异常。
Get current stack trace in Ruby without raising an exception
梗概:
在方法调用中,添加以下行
puts Kernel.caller
Kernel.caller
是一种返回当前堆栈跟踪的方法。您可以使用caller
代替Kernel.caller
,但我喜欢明确:)。希望你能找到神秘的cron工作来自哪里。
答案 1 :(得分:0)
正如我评论的那样,使用Process.pid&amp; Process.ppid
(获取当前和父pid)。