Rails,Nginx,乘客,数字海洋:系统命令在生产中不起作用

问题描述

导轨:Rails 6.0.3.4

Ruby :ruby 2.6.3p62(2019-04-16修订版67580)[x86_64-linux]

Nginx Nginx版本:Nginx / 1.18.0(Ubuntu)

乘机乘客:5.3.2

在我的控制器中,我想运行系统命令。它在本地工作,但不能在远程工作。

代码

我创建一个markdown文件并将其存储在我的公用文件夹中。

dir = Rails.root.join('public','pancritic')
Dir.mkdir(dir) unless Dir.exist?(dir)
File.open(dir.join("pancritic.md"),'w+') do |file|
  file.write(@inputs[:text])
end

文件存储在/ public / pancritic中之后,我要运行系统命令:

`pancritic -s -o #{dir}/pancritic.pdf #{dir}/pancritic.md`

代码将markdown文件转换为pdf。输出存储在同一文件夹中。

但是在生产中(在Digital Ocean上),该命令不会创建pdf。

系统命令是否可以在Digital Ocean上使用?

当我以非root用户身份登录数字海洋时,请进入cd / public / pancritic,然后输入

pancritic -s -o pancritic.pdf pancritic.md 

pdf被创建。我认为命令本身没有错。

当我访问页面时,我看到了如何在公共/ pancritic文件夹中创建markdown文件。当我手动运行命令pancritic -s -o pancritic.pdf pancritic.md时,页面将加载,并且pdf会按预期显示

该命令在生产环境中不起作用的原因可能是什么?

在旅客的production.log或error.log中找不到任何信息。

到目前为止我尝试过的事情

我尝试了其他输入系统命令的方法。它们都在本地工作,但是都不在生产中工作:

system("pancritic -s -o #{dir}/pancritic.pdf #{dir}/pancritic.md")

Open3.popen3("pancritic -s -o #{dir}/pancritic.pdf {dir}/pancritic.md") do |stdin,stdout,stderr,wait_thr|
   ...
    end

%x[pancritic -s -o #{dir}/pancritic.pdf {dir}/pancritic.md]

完整代码

  def pancritic_editor
    if params[:inputs].present?
      @inputs = OpenStruct.new(params[:inputs])
    else
      @inputs = OpenStruct.new()
    end

    start_markdown ='
# Introduction
Text
'

@inputs[:text] = @inputs[:text] ? @inputs[:text] : start_markdown

dir = Rails.root.join('public','w+') do |file|
  file.write(@inputs[:text])
end

`pancritic -s -o #{dir}/pancritic.pdf #{dir}/pancritic.md`

until File.exist?("#{dir}/pancritic.pdf")
  sleep 1
end

File.open("#{dir}/pancritic.pdf") do |file|
  @stuff = Stuff.create(filename: "pancritic_editor #{DateTime.Now}")
  @stuff.file.attach(io: file,filename: "basic-markdown-editor-#{Date.today.to_s}.pdf")
end

File.delete("#{dir}/pancritic.md")
File.delete("#{dir}/pancritic.pdf")
  end

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...