【问题标题】:system call in perl script return -1 when running with puppet使用 puppet 运行时 perl 脚本中的系统调用返回 -1
【发布时间】:2014-02-10 06:00:36
【问题描述】:

我有一个第三方 perl 脚本,我需要用 puppet 运行它。在脚本中有一些命令可以使用以下 perl 语句创建目录:

system("mkdir -p /tmp/agent") && die "failed to create agent dir";

我可以使用 root 用户手动运行脚本而没有任何问题。但是,当我使用 puppet 运行脚本时:

exec {'install agent':
    command => "perl /tmp/install_agent.pl",
    creates => '/tmp/agent/agent',
    path => '/usr/bin',
}

我收到以下错误:

Error: perl /tmp/install_agent.pl returned 2 instead of one of [0]

当我尝试捕获系统调用的返回值时,我得到了 -1。通过更多测试,似乎所有系统调用都以-1失败。

有什么建议吗?谢谢!

【问题讨论】:

  • Perl 是否在污点模式下运行?检查${^TAINT},记录在perlvar 中。在perlsec 了解更多关于tain 模式的信息。
  • 查看${^CHILD_ERROR_NATIVE} 中的die 语句以获取子调用的返回值。
  • 或者,将system() 调用更改为对mkdir() 的本机调用,然后如果您遇到任何故障,您可以查看$! 以获取更多信息。
  • ${^TAINT} = 0 和 ${^CHILD_ERROR_NATIVE} = -1
  • 而mkdir()返回1,目录创建成功....

标签: perl puppet


【解决方案1】:

我怀疑 /tmp/install_agent.pl 在 exec 运行时不存在。作为一个测试,我运行了“perl /nonexistant.file”,返回码是 2。

您创建文件的水源需要首先运行。所以如果是文件资源:

file {'/tmp/install_agent':
  ensure => file,
  content => 'system("mkdir -p /tmp/agent") && die "failed to create agent dir";'
}

exec {'install agent':
    command => "perl /tmp/install_agent.pl",
    creates => '/tmp/agent/agent',
    path => '/usr/bin',
    require => File['/tmp/install_agent.pl'],
}

【讨论】:

  • 我确定 install_agent.pl 存在,因为在“system("mkdir -p /tmp/agent")”被执行并提取了一些文件之前的状态。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-12
  • 2011-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多