$argv 在 Centos 和 RHEL 系统之间的行为是否相同

Does $argv behave the same between Centos and RHEL systems

我正在尝试对名为 GOTS - Grant Of The System 的旧 TCL 会计脚本进行故障排除。它所做的是为每个用户登录和注销创建一个带时间戳的日志文件条目。问题是它没有在注销时创建第二个日志文件条目。我想我找到了出错的地方,并将其附在此处。仅供参考,日志文件存在并且不会因错误 "GOTS was called incorrectly!!" 而退出。它应该为 [string match "$argv" "end_session"]

执行 if then

该软件在 RHEL Linux 6.9 上运行正常,但在 Centos 7 上运行失败。我认为不同系统的 $argv 参数向量存在系统变量或差异创建此行为。

我对 $argv 的怀疑是否正确,如果没有,有人能看出真正的问题吗?

如何在注销时打印或显示 $argv 值?

# Find out if we're beginning or ending a session
if { [string match "$argv" "end_session"] } {
    if { ![file writable $Log] } {
    onErrorNotify "4 LOG"
    }
    set ifd [open $Log a]
    puts $ifd "[clock format [clock seconds]]\t$Instrument\t$LogName\t$GroupName"
    close $ifd
    unset ifd
    exit 0
} elseif { [string match "$argv" "begin_session"] == 0 } {
    puts stderr "GOTS was called incorrectly!!"
    exit -1
} 

end_session 由 /etc/gdm/PostSession/Default 文件填充

#!/bin/sh


### Begin GOTS PostSession
#  Do not run GOTS if root is logging out
if test "${USER}" == "root" ; then
    exit 0
fi

/usr/local/lib/GOTS/gots end_session > /var/tmp/gots_postsession.log 2> /var/tmp/gots_postsession.log
exit 0
### End GOTS PostSession

这是会话后日志文件:

Application initialization failed: couldn't connect to display ":1"
Error in startup script: invalid command name "option"
    while executing
"option add *Font "-adobe-new century schoolbook-medium-r-*-*-*-140-*-*-*-*-*-*""
    (file "/usr/local/lib/GOTS/gots" line 26)

经过大量故障排除后,我们确定无论出于何种原因,Centos 都不允许执行 /etc/gdm/PostSession/default 文件的一部分:

fi

/usr/local/lib/GOTS/gots end_session  

但它确实更新了 PostSession.log 文件,因为它应该..。有谁知道什么可能只干扰 PostSession/default 的一部分?

Does anyone have any idea what could be interfereing with PostSession/default?

难道你在打Bug 851769

就是说,正如您的调查显示,这不再是 Tcl-related 问题或疑问,我的说法是否正确?

所以事实证明我们的脚本有某些元素依赖于 Xserver 运行注销时显示一些 GUI 错误消息。这来自:

Gnome Configuration

"当用户终止他们的会话时,GDM 将 运行 PostSession 脚本。请注意,Xserver 将在该脚本 运行 时停止,因此不应访问它.

请注意,即使显示由于 I/O 错误或类似错误而无法响应,PostSession 脚本也会 运行。因此,无法保证 X 应用程序在脚本执行期间正常工作。"

我们不得不重写这些错误消息标注,以便它们只是将错误写入文件,而不是依赖于显示。这些错误是针对一开始就应该存在的内容。