【问题标题】:How to fix /usr/bin/env agrument processing?如何修复 /usr/bin/env agument 处理?
【发布时间】:2012-12-07 08:40:05
【问题描述】:

我在 /usr/bin/env 中遇到了一个奇怪的问题...我设计了一个简单的脚本来显示这个问题。该脚本在 Ruby 中,但在 Python 中的类似脚本也会发生同样的情况。这是脚本:

#!/usr/bin/env ruby

p ARGV

另外一个没有/usr/bin/env

#!/data/software/ruby-1.9.2-p180/bin/ruby

p ARGV

如您所见,它应该只打印脚本参数。它在头节点上完美运行:

[gusev@scyld test]$ which ruby
/data/software/ruby-1.9.2-p180/bin/ruby
[gusev@scyld test]$ ./script.no_usr_bin_env.rb 1 2 3
["1", "2", "3"]
[gusev@scyld test]$ ./script.usr_bin_env.rb 1 2 3
["1", "2", "3"]

但是在计算节点上运行时,卡住了:

[gusev@scyld test]$ qsub -d $(pwd) -I
qsub: waiting for job 176427.scyld.localdomain to start
qsub: job 176427.scyld.localdomain ready

-bash-3.2$ ./script.no_usr_bin_env.rb 1 2 3
["1", "2", "3"]
-bash-3.2$ ./script.usr_bin_env.rb 1 2 3
<stuck>

/usr/bin/env 在两台机器上完全相同:

[gusev@scyld test]$ md5sum /usr/bin/env
7ada476000967f2e4cca2bc669045479  /usr/bin/env
[gusev@scyld test]$ qsub -I -d $(pwd)
qsub: waiting for job 176428.scyld.localdomain to start
qsub: job 176428.scyld.localdomain ready

-bash-3.2$ md5sum /usr/bin/env
7ada476000967f2e4cca2bc669045479  /usr/bin/env

我知道使用 /usr/bin/env 处理参数可能很棘手。但是我们有很多软件都在使用它,我们不能只修复它们。有什么办法可以解决这个问题吗?

【问题讨论】:

  • 您确定您节点上的 PATH 中的 ruby 有什么好处吗?是否与/data/software/ruby-1.9.2-p180/bin/ruby 相同?
  • 确实,问题出在计算节点上的 PATH 变量上。

标签: linux cluster-computing


【解决方案1】:

#!/usr/bin/env ruby 导致脚本由$PATH 中的第一个ruby 可执行文件执行。您的 $PATH 在计算节点上可能会有所不同,这很可能是因为 qsub 设置环境的方式。

快速而肮脏的解决方法是:

PATH=/data/software/ruby-1.9.2-p180/bin:$PATH ./script.usr_bin_env.rb 1 2 3

但您应该找到一种更简洁的方法来确保在执行 Ruby 脚本之前正确设置 $PATH

如需更多详细信息,请在计算节点上尝试which rubytype rubyecho $PATH,并确保ruby 命令确实有效。

(有关#!/usr/bin/env ...#!.../ruby 的更多讨论,请参阅my answerthis question)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-07
    • 2016-03-23
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多