【问题标题】:Why won't 'system' call in perl return?为什么 perl 中的“系统”调用不返回?
【发布时间】:2018-09-07 03:56:05
【问题描述】:

在这方面有新的、激进的发展。到最后阅读。

为 x86_64-linux-thread-multi 构建的 perl 5,版本 18,subversion 2 (v5.18.2)
RH6

我有一个 perl 脚本,它发出一个运行 tcsh 脚本的 system() 调用,但对于一个用户,它不会从该系统调用返回。代码是这样的……

#!/usr/bin/env perl
print "about to make the system call...\n";
$rv = system("tcsh aa.csh");
print "system call finished, return val = $rv\n";
exit;

还有 aa.csh 脚本...

echo "In shell script"     
mkdir foo
source someotherscript.csh
ln -s xxx yyy
echo "In shell script, about to exit"
exit

此脚本会为除一个以外的所有用户运行完成。他看到了……

about to make the system call...
In shell script
In shell script, about to exit

它只是挂起。如果我点击 ^C,它就完成了..

system call finished, return val = 2

有趣的是,它会打印“在 shell 脚本中,即将退出”,下一步是“退出”,但它只是不这样做,至少对于这个用户来说不是。在我看来,它之前的所有命令都是无关紧要的,因为它到达了这个“即将退出”的消息。看来 ^C 正在中断 shell 脚本(不会退出)并返回到继续完成的 perl 脚本。

所以我的问题与了解为什么它为这个人挂起。他的环境中一定有什么东西导致了这个问题,但我不知道是什么。 “2”的返回值是什么意思?可能没有任何意义,因为我用 ^C 打断了。

感谢您的帮助

新发展

这与 perl 无关。如果 aa.csh 脚本只是...

exit

然后用户运行...

tcsh aa.csh

挂了。

这是怎么回事?

版主,这个帖子应该被删除,我应该重新发布吗(因为这完全不同)?

【问题讨论】:

  • someotherscript.csh 是做什么的?
  • 我必须调查一下。但是,考虑到它已经过去了,直到退出命令,这真的重要吗?此外,其他人运行此脚本也没有问题。
  • tcsh 脚本的第一行通常应该是 #!/bin/tcsh -f-f 告诉 shell 不要获取用户的 .login 文件。或者您可以将脚本调用为tcsh -f aa.csh 而不是tcsh aa.csh。如果添加-f 解决了该用户的问题,那么问题出在该用户的.login(或其他一些启动文件)中。
  • 请先阅读minimal reproducible example,然后再在这里发布更多问题。祝你好运。
  • 清理一切。让该用户注销(并可能重新启动机器)并重试。如果相同,他们应该删除(并保存!)他们的 shell 配置文件并重试。如果可行,那么他们可以开始一次放回一点配置。

标签: linux perl tcsh


【解决方案1】:

问题是 .history 文件损坏。

【讨论】:

    【解决方案2】:

    让他跑

    which exit
    

    来自tcsh 提示。如果它没有说类似

    exit: shell built-in command
    

    而是类似

    exit:   aliased to sleep 99999
    

    那么你就发现了你的问题。

    如果exit 确实是您的aa.csh 脚本的最后一行,那么它是多余的,并且您还尝试使用最后不调用exit 的脚本版本。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-11
      • 1970-01-01
      • 2014-01-23
      • 1970-01-01
      • 2012-01-24
      • 2020-03-15
      • 1970-01-01
      • 2021-05-01
      相关资源
      最近更新 更多