首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将脚本输出记录到STDOUT和文件

如何将脚本输出记录到STDOUT和文件
EN

Stack Overflow用户
提问于 2016-11-01 00:01:01
回答 2查看 1.2K关注 0票数 2

我有以下Ruby块:

代码语言:javascript
运行
复制
ruby_block "Validate" do
  block do
    require "mixlib/shellout"
    begin
      cmd = Mixlib::ShellOut.new("/usr/local/bin/someScript.py", :timeout => 3600)
      cmd.live_stream = STDOUT
      cmd.run_command
      cmd.error!
    rescue Exception => e
      puts "Action failed..."
      return 168
    end
  end
  action :create
  notifies :create, "ruby_block[Validated]", :immediately
  not_if { node[:state][:validated] == true }
end

我想将脚本的结果记录到STDOUT和一个名为“/tmp/xml_diff_Resul.txt”的文件中。

我做的第一件事就是改变:

代码语言:javascript
运行
复制
cmd=Mixlib::ShellOut.new("/usr/local/bin/someScript.py", :timeout => 3600)

至:

代码语言:javascript
运行
复制
cmd=Mixlib::ShellOut.new("/usr/local/bin/someScript.py > /tmp/xml_diff_results.txt", :timeout => 3600)

然而,这并没有达到我的预期。

然后我注意到了cmd.live_stream变量。有什么办法可以让我利用它来做这样的事吗?

代码语言:javascript
运行
复制
cmd.live_stream = (STDOUT > /tmp/xml_diff_results.txt)

解决方案:

解决我的问题的方法很简单,并且受到了“厨具”的启发。

代码语言:javascript
运行
复制
log_file = File.open('/tmp/chef-run.log', File::WRONLY | File::APPEND)
LOG = Logger.new(log_file)

def shell(command)
  LOG.info "Execute: #{command}"
  cmd = Mixlib::ShellOut.new(command, :timeout => 1800)
  cmd.run_command
  LOG.info "Returned: #{cmd.stdout}"
  cmd.error!
  cmd
end
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-02 09:35:46

Ruby中的另一个选项(只是内部部分),以防tee不可用(windows):

代码语言:javascript
运行
复制
  cmd = Mixlib::ShellOut.new("/usr/local/bin/someScript.py", :timeout => 3600)
  cmd.live_stream = STDOUT
  cmd.run_command
  # new part
  log=::Tempfile.new(["xml_diff_results",".txt"])
  errlog=::File.open(log.path.gsub(".txt",".err")
  log.write(cmd.stdout)
  errlog.write(cmd.stderr)
  log.close
  errlog.close
  Chef::Log.info("Log results are in #{log.path}")
  # end of new part 
  cmd.error!

如果您运行的是没有Chef::Log的主厨客户端,并且真正希望在主厨日志中打印路径,则将-l info级别更改为warn

主要的优点是它的平台无关,缺点是日志文件只有在命令结束执行后才会被写入。

票数 2
EN

Stack Overflow用户

发布于 2016-11-01 00:44:50

这不是红宝石,甚至不是厨师的问题。这更像是一个沉重的问题

运行命令并将其输出重定向到stdout和文件的一种方法是使用tee

代码语言:javascript
运行
复制
echo 'Hello World!' | tee output.log

所以,用你的例子可以是这样的

代码语言:javascript
运行
复制
cmd=Mixlib::ShellOut.new("/usr/local/bin/someScript.py | tee /tmp/xml_diff_results.txt", :timeout => 3600)
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40352299

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档