问题描述
导轨: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 (将#修改为@)