AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 759761
Accepted
Dreamer
Dreamer
Asked: 2023-10-25 03:08:24 +0800 CST2023-10-25 03:08:24 +0800 CST 2023-10-25 03:08:24 +0800 CST

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

  • 772

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

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

ssh [email protected] 

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

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

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

Connection to [email protected] closed.

所以我必须重新登录。

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

nohup
  • 2 2 个回答
  • 56 Views

2 个回答

  • Voted
  1. bxm
    2023-10-25T03:52:53+08:002023-10-25T03:52:53+08:00

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

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

    我会尝试运行它:

    ./work.sh param1 param2
    

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

    $SHELL ./work.sh param1 param2
    

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

    $SHELL
    . work.sh param1 param2
    
    • 2
  2. Best Answer
    bakunin
    2023-10-25T06:06:10+08:002023-10-25T06:06:10+08:00

    有了我的访问权限,那么我需要在我的主文件夹中运行脚本
    [[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
    

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

    • 1

相关问题

  • nohup 是否仅适用于 shell 进程的子进程,而不适用于非 shell 进程的子进程?

  • `disown -h` 和 `nohup` 有效地工作相同吗?

  • 为什么 nohup 后台进程被杀死?

  • 有时使用`read -t 3`代替`sleep 3`会很方便。我如何使它与`nohup`一起工作?

  • 为什么进程被 nohup 杀死

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve