【问题标题】:csh script run from Java GUI crashes and freezes terminal从 Java GUI 运行的 csh 脚本崩溃并冻结终端
【发布时间】:2012-08-03 19:07:27
【问题描述】:

我有一个从 Java GUI 运行的脚本。它执行 SQL 脚本并将结果写入 tmp 目录中的日志文件。脚本的其余部分应该打开一个 xterm 并将输出文件的结果显示到屏幕上。它会按预期创建日志文件,并且还会打开一个 xterm。唯一的问题是它在那之后冻结了,我必须再次重新启动整个过程。这是我用来打开 xterm 的脚本示例

#!/bin/csh -f



#set MYSQL=${MYSQL_HOME}/mysql
set PSQL=${PSQL_HOME}/psql
set MORE=/usr/xpg4/bin/more


set REPORT=/h/Scripts/DataValidation/ParametersDataReport.sql


#${REPORT}

${PSQL} ${USER}<${REPORT} 

#Get the number of lines in the report file for scrollbar control
#set lc='wc -l /tmp/results.log'
#echo $lc

#Open an extra terminal

set title="EARTH ORIENTATION PARAMETERS REPORT"

/usr/openwin/bin/xterm -T "$title" \
-bg lightblue -fg black -sb -sl 2000 -ut -e ${MORE}  \
-f /h/USERS/Pablito/results.log     \

exit

MOREtitle 在脚本文件中定义为变量。为什么我的脚本崩溃并导致终端挂断?这可能是分段错误吗?

我通过 ssh 连接来完成这一切。我查看了发出的命令,这就是它所说的:

/usr/openwin/bin/xterm -sb -ls -display@d&@;

我在终端上输入了这个命令,结果显示得很好。为什么我不能从 GUI 执行此操作?

/usr/openwin/bin/xterm -T EARTHORIENTATIONPARAMETER -geometry 104x50+0+80 -bg lightblue -fg black -sb -sl 2000 -ut -e /usr/xpg4/bin/more -f /tmp/results.log

当我尝试使用 GUI 时,它只是冻结在我身上(意味着我无法访问 GUI 或终端)。它还包含一个错误

bg: Command not found

在启动 GUI 的终端上。

我想我真正应该问的是如何在 csh 脚本中执行以下命令,因为当我从终端手动输入时,它会产生预期的效果

xterm -T "EarthOrientation Parameter" -geom 104x50+0+80 -bg pink -fg black -sb -sl   2000 -ut -e /usr/xpg4/bin/more -f /h/USERS/local/Pablito/results.log

【问题讨论】:

  • 您正在前台调用xterm 命令。这意味着脚本将等到xterm 终止——即,直到终端窗口关闭。当您关闭 xterm 窗口时会发生什么?此外,您的脚本中似乎缺少反斜杠(实际脚本中是否缺少反斜杠,或者您只是在发布时打错了字?),exit 应该缩进,以便它作为代码块的一部分出现。
  • 当我关闭 xterm 时它只会关闭 dowm 并关闭 GUI
  • 你怎么知道我在后台调用 xterm?我先给 xterm 命令,然后它就挂断了抱歉,因为缺少反斜杠的类型
  • 然后看起来脚本运行正常;它启动xterm,并在xterm 窗口关闭时终止。我猜不出为什么 GUI 会关闭;这将是您的 Java 代码中没有向我们展示的内容。
  • "你怎么知道我在后台调用 xterm?"我说你在前台调用 xterm。要在后台调用它,您需要使用&amp; 来执行命令。我不知道你是否想这样做;程序应该在xterm 窗口可见时继续运行,还是应该等待?

标签: csh xterm


【解决方案1】:

我假设您问题中的脚本版本与您实际运行的脚本版本相匹配。

/usr/openwin/bin/xterm \
-title "$title"        \ 
-geometry 100x40+0+90
-bg lightblue -fg brown \
-sb -sl 2000 -ut
-e ${MORE} -F /tmp/results.log

如果您要将其作为 csh 脚本调用,它需要在顶部有一个 #!/bin/csh -f或者您需要将其显式调用为 csh -f script-name

您缺少几个反斜杠。由于-geometry 行上没有\,因此后面的行不会作为参数传递给xterm 命令。您向我们展示的代码相当于:

/usr/openwin/bin/xterm -title "$title" -geometry 100x40+0+90
-geometry 100x40+0+90 -bg lightblue -fg brown sb -sl 2000 -ut 
-e ${MORE} -F /tmp/results.log

这应该调用xterm 而不指定任何命令,因此它将以交互方式运行您的默认shell。以下行应产生错误消息:

-geometry: Command not found.
-e: Command not found.

但如果您从 GUI 调用脚本,您可能不会看到这些消息。

geometry-sb 行的末尾添加\ 字符应该可以解决这个问题。

由于脚本在前台调用xterm(在命令中没有尾随&amp;),因此脚本将等待xterm 窗口关闭后再终止。

你说它“冻结了”;我不确定你的意思是什么,但是在 xterm 关闭并且脚本终止之后发生的任何事情都将由你的 Java GUI 代码控制,你没有向我们展示。

再次,我假设您实际运行的脚本中缺少这些反斜杠。如果没有,您需要更新您的问题,向我们展示您正在运行的确切脚本。

更新:

显然我的假设是不正确的;您的实际脚本与最初出现在您的问题中的脚本完全不同。

我无法足够强调复制并粘贴导致问题的确切脚本或程序,或者您已确认导致相同问题的修改版本的重要性问题。如果您尝试发布脚本的近似值,您很可能会忽略导致问题的代码。

http://sscce.org/ 对此进行了讨论,但该网站目前似乎已关闭;谷歌缓存是here

以下是您的问题中脚本的相关部分:

/usr/openwin/bin/xterm -T "$title" \
-bg lightblue -fg black -sb -sl 2000 -ut -e ${MORE}  \
-f /h/USERS/Pablito/results.log     \

exit

在评论中,你说你遇到了类似的错误

-bg Command is not found

这确实应该在问题中,因为对于任何试图回答它的人来说,它都是至关重要的信息。

(我怀疑它真的是-bg: Command not found.;同样,准确的复制和粘贴对于错误消息和代码一样重要。)

我认为现在的问题是xterm 行的反斜杠后有一个空格。 \ 行继续字符必须位于行尾。如果反斜杠后面有空格,则不视为续行符,下一行将视为单独的命令。

而且你的命令最后一行的\ 是无用的并且有潜在的危险。它将该行与以下行连接起来,该行是空的,因此可能无害,但如果您删除该空行,它会将单词 exit 作为参数传递给 xterm

最简单的解决方法是修改您的脚本,使整个命令位于一个(非常长的)行上,并且没有反斜杠。

【讨论】:

  • 我已经用我正在尝试执行的最新脚本编辑了我的原始问题
  • 它应该执行语句 -f /h/USERS/Pablito/results.log 但它只是停止设置标题并冻结(GUI 和 xterm 屏幕仍处于活动状态但无法访问)跨度>
  • 您问题中的脚本现在有-f h/USERS/Pablito/results.log;不应该是-f /h/USERS/Pablito/results.log 吗? exit 是脚本的一部分吗?如果是这样,请在其前面插入 4 个空格,使其显示为代码块的一部分。为什么你的命令的最后一行后面有一个反斜杠?后面有空行吗?如果是这样,反斜杠会将空行加入您的命令,这是无害的,但无论如何您都应该删除反斜杠。
  • xterm 出现并且它只是空白。它还会导致其他所有内容都冻结并且无法访问(这部分很有意义,因为您说我应该添加 & 以释放其他进程),但奇怪的是 xterm 是空白的。它几乎就像脚本没有退出并且正在等待其他命令一样。 -f h/USERS/Pablito/results.log 应该将日志文件中的内容读取到我的 xterm 中。退出是脚本的一部分,我很抱歉
  • 所以它使用h/USERS/Pablito/results.log相对于当前目录的路径,而不是绝对路径/h/USERS/Pablito/results.log?你确定那是它应该做的吗?您确定当前目录在您调用脚本时是包含h 子目录的目录吗?请回答我之前关于反斜杠和空行的评论中的问题,并按照我的建议编辑问题,以便 exit 出现在代码块中。
猜你喜欢
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
  • 2017-06-10
  • 1970-01-01
  • 2019-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多