1

我们需要使用基于大型机的调度程序而不是 cron 来执行实用程序任务。此调度程序与主机上的代理通信,然后执行通用 setuid ksh 脚本,该脚本将实用程序与所需的任何参数一起作为参数执行。setuid ksh 脚本然后调用另一个脚本及其参数。

在我的例子中,下一个脚本 ( execute_something.ksh) 将一些环境变量cds 设置为 Rails 根目录,并rails runner Module.function -e <environment>在 environment 是传递的 arg 的位置执行。

所以那是:

mainframe -> agent -> setuid_script -> execute_something.ksh -> Module.function

当我像我自己一样直接调用时execute_something.ksh,它工作正常。当我调用 setuid 脚本时,出现以下错误:

/[path]/bin/rails:15:in `force_encoding': 未知编码名称 - 来自 /[path]/bin/rails:15:in main 的 BINARY (ArgumentError)

不是权限问题。所有涉及的文件要么归 setuid 用户所有,要么拥有 setgid 组的完整组权限并属于该组。(是的,矫枉过正,但这就是我得到的。)

setuid 脚本继承了我的环境(除了存在 setuid 用户的 EUID)。

此外,正在执行的 rails 脚本与安装在我的 linux 笔记本电脑上的脚本不同(我确实提到这是一个 solaris 问题)。

rails 脚本是:

#!/usr/bin/env ruby
#
# This file was generated by RubyGems.
#
# The application 'railties' is installed as part of a gem, and
# this file is here to facilitate running it.
#

require 'rubygems'

version = ">= 0"

if ARGV.first
  str = ARGV.first
  str = str.dup.force_encoding("BINARY") if str.respond_to? :force_encoding
  if str =~ /\A_(.*)_\z/
    version = $1
    ARGV.shift
  end
end

gem 'railties', version
load Gem.bin_path('railties', 'rails', version)

这对我有用。我明确删除了对我的主目录沙箱的所有引用PATH-LD_LIBRARY_PATH它仍然适用于我,而不适用于 setuid 用户。

我无权更改全局环境中的内容 - 我必须提出请求并等待。没有办法改变模块必须执行的方式。

请有人 - 给我一些想法?我不认为这适用于很多人,但这不是一个有趣的谜题吗?

TIA。

卡里达

4

1 回答 1

0

rails 命令的目的是调用 script/rails(如果存在),因此您可以直接调用该脚本:

./script/rails runner Module.function -e <environment> 
于 2012-06-07T01:43:34.683 回答