脚本失败时如何避免 SSH 退出

脚本失败时如何避免 SSH 退出

请原谅我基本的 unix/linux 脚本编写能力和糟糕的英语

我正在 Linux VM 中测试一个脚本,假设它是work.sh.所以我必须 ssh 到虚拟机

ssh [email protected] 

有了我的访问权限,那么我需要在我的主文件夹中运行脚本

[[email protected] ~]. work.sh param1 param2

当批处理脚本中出现问题时,我可以看到错误,但也会被踢出 VM/ssh 会话

Connection to [email protected] closed.

所以我必须重新登录。

我尝试了 nohup,但我也喜欢将任何错误/日志输出到控制台。处理这种情况的更好方法是什么

答案1

听起来set -e剧本里有一个。如果源脚本(使用 运行. scriptname)在启用该设置的情况下抛出错误,则关闭 shell 将是预期的行为。

如果没有对脚本的任何了解,我不能肯定地说您不应该运行它,.但这是一种不寻常的做事方式。

我会尝试运行它:

./work.sh param1 param2

如果您试图克服丢失的执行位阻止您运行脚本的问题,您可以尝试:

$SHELL ./work.sh param1 param2

或者,您可以启动一个额外的 shell 并像现在一样运行——这可能会让您看到一条错误消息

$SHELL
. work.sh param1 param2

答案2

有了我的访问权限,那么我需要在我的主文件夹中运行脚本
[[email protected] ~]. work.sh param1 param2

有两种调用脚本的方法:“正常调用”和“点调用”或“采购”:

$ /path/to/executable
$ . /path/to/executable

区别在于:第一个变体将使操作系统启动一个新进程(shell 的子进程),加载并执行其中的脚本,当如此加载的脚本结束其运行时,该进程将再次关闭 - 然后您又回到了您的 shell 进程很可能会向您显示另一个提示。

第二种变体的行为类似,但有一个重要的区别:没有创建子进程,但脚本在当前进程。我不确定work.sh会发生什么(如果您想发表评论,您应该发布其内容),但我怀疑它会以某种方式离开您的登录 shell,这就是导致断开连接的原因。不要以前面的点开始,您很可能不会再遇到断开连接的情况。

奖金信息
根据我的经验,当初学者可以通过一些实验来观察某件事的效果时,他们学得最好、最快。所以这里是:

您可以通过编写以下脚本并将其另存为“my_script.sh”来查看点执行和正常执行之间的区别:

#!/bin/bash
my_x="abc"
my_y="def"

不要忘记使其可执行(chmod 754 my_script.sh)并以正常方式执行脚本,然后显示两个定义变量的内容:

$ ./my_script.sh
$ echo $my_x $my_y

您将看到的效果是:什么也没有——变量没有设置。原因很简单:在脚本开始时启动了另一个进程,发生了变量的定义那里当流程关闭时,它们再次消失,因为它们是环境,不是你的。

现在使用点执行运行相同的脚本:

$ . ./my_script.sh
$ echo $my_x $my_y
abc def

您会注意到,这次确实设置了变量:原因是脚本不是在某个新进程中执行,而是在您的进程中执行 - 因此变量定义发生在您的环境中,并且随后仍然存在。

相关内容