登录或退出时,特定用户的 shell 会冻结,直到他们按 Ctrl+C

登录或退出时,特定用户的 shell 会冻结,直到他们按 Ctrl+C

我们使用的是 CentOS 6.9,我的一个用户遇到了一个错误,如果他们登录,屏幕将被冻结,直到他们按 Ctrl+C。当他们退出时也会发生同样的事情。当我是 root 和 su - 作为麻烦的用户时,也会发生这种情况。该用户使用 tcsh,但我还没有看到任何其他使用 tcsh 的用户遇到这个问题

[root@boop] # su - troublesome_user
(hangs until terminate)    
^C[troublesome_user@boop ~]$ exit
logout
(hangs until terminate)
^C [root@boop] #

我最熟悉 bash,因此我检查了 .bash_profile 和 .bash_rc,但我现在知道 tcsh 使用一组不同的 .profile 文件。我查看了他们的 .cshrc 文件,没有发现任何奇怪的东西。

内容如下:

setenv LC_ALL C
set path = ($path /nfs/bin) 

有人知道 tcsh 的任何功能是否可能导致此问题吗?

谢谢!

答案1

首先,我会检查 tcsh 启动时执行命令的所有位置。

手册页有这样的说法(我已将文件位置加粗):

登录 shell 首先执行系统文件中的命令/etc/csh.cshrc/etc/csh.login。然后它从用户主目录中的文件执行命令:首先〜/.tcshrc(+) 或者,如果未找到 ~/.tcshrc,〜/.cshrc, 然后~/.历史(或值histfile shell 变量), 然后〜/.login,最后〜/.cshdirs(或值dirsfile shell 变量)(+)。 shell 可能会在 /etc/csh.cshrc 之前而不是之后读取 /etc/csh.login,并且在 ~/.tcshrc 之前而不是之后读取 ~/.login 或 ~/.cshrc 和 ~/.history(如果如此编译);请参阅版本 shell 变量。 (+)

如果这没有引导你到任何地方,我会尝试以下两件事:

  • 以有问题的用户身份登录并让它挂起,切换到不同的控制台并检查w- 这应该会显示该用户正在运行的内容。
  • Ctrl+Z而不是Ctrl+C- 应该暂停正在运行的进程而不是中断它。然后jobs看看什么被暂停了。

编辑:正如 JdeBP 在评论中指出的那样,您还可以在 su 中设置tcsh-x-Vtcsh 选项 - 尽管我认为您可以找到-X.像这样的东西:

su - troublesome_user -- -X
  • -x 在执行前回显所有命令
  • -v 命令输入在历史替换后回显
  • -X 与 -x 相同,但甚至在处理 .tcshrc 之前也适用
  • -V 与 -v 相同,但甚至在处理 .tcshrc 之前也适用

相关内容