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 / 问题 / 792640
Accepted
Denis
Denis
Asked: 2025-03-18 21:37:29 +0800 CST2025-03-18 21:37:29 +0800 CST 2025-03-18 21:37:29 +0800 CST

自动或手动终止屏幕会话

  • 772

我已经创建了一个screen会话并在该会话中运行rsync:

screen -S rsync_backup

rsync -rvnc data/ data2 >rsync_out-4.txt 2>rsync_outErr-4.txt

我使用top命令进行进度监控,最初我在输出中看到了screen和(玩具示例如下):rsynctop

PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                                                                                      
1619 denis     20   0  170096   4644      0 S   0.0   0.0   0:00.00 rsync                                                                                        
1739 denis     20   0    7320   2828   2064 S   0.0   0.0   0:00.02 screen

过了一段时间, 不再出现rsync,但screen仍然出现在top输出中:

PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND                           
1739 denis     20   0    7320   2828   2064 S   0.0   0.0   0:00.02 screen

我的问题是:

  1. screen当会话中运行的命令(rsync在我的情况下)完成时,会话是否应该自动终止?
  2. 典型user场景是否假设在screen命令(例如rsync)执行完成后强制手动终止会话?即:
screen -S rsync_backup

rsync -rvnc data/ data2 >rsync_out-4.txt 2>rsync_outErr-4.txt
screen -XS <session-id> quit
rsync
  • 2 2 个回答
  • 346 Views

2 个回答

  • Voted
  1. David G.
    2025-03-19T08:24:37+08:002025-03-19T08:24:37+08:00

    我不同意@ReflectYourCharacter 的回答。

    当会话中运行的命令(在我的情况下是 rsync)完成时,屏幕会话是否应该自动终止?

    当其中的命令完成后, screen 会话会自动终止。但是,如果您正在运行 shell,则 shell 就是命令。

    例如,如果您输入:

    screen -S somename sleep 5
    

    将创建一个 screen 会话,其中一个窗口运行命令sleep 5。当此命令退出时,screen退出。

    另一方面,如果您确实screen -S somename等待提示,并sleep 5在该提示符下键入,则退出后 shell 仍在该窗口中运行sleep并screen继续。

    我建议以下之一:

    1. 在 提示符下screen,在命令前加上exec。
      这将导致命令替换 shell,因此命令退出时窗口和屏幕也会退出。
    2. 以 方式运行命令这将以方式在窗口中screen -S rsync_backup sh -c 'rsync -rvnc data/ data2 >rsync_out-4.txt 2>rsync_outErr-4.txt' 运行命令,然后 shell 将解析命令行和重定向。完成后,和 也将解析。请注意,如果您不使用,重定向将应用于屏幕输出,这不是您想要的。sh -c '...'rsyncshscreensh -c '...'
    3. 进一步执行上一步,编写包含rsync命令的脚本。然后在命令行上调用该命令screen。该脚本无需使用sh -c '...',因为它提供了自己的 shell。
    • 6
  2. Best Answer
    ReflectYourCharacter
    2025-03-18T22:31:48+08:002025-03-18T22:31:48+08:00

    当会话中运行的命令(在我的情况下是 rsync)完成时,屏幕会话是否应该自动终止?

    视情况而定。如果屏幕由命令启动,则命令完成后它会关闭。

    如果它运行交互式 shell,会话将保持打开状态直到手动退出。

    1. 直接执行命令时自动终止
    • screen -S test_session ./test
    1. 分离模式
    • screen -S test_session -dm ./test
    1. screen由于交互式 shell 正在运行,因此保持打开状态
    • screen -S test_session
    1. exec确保that屏幕自动终止
    • screen -S test_session -dm bash -c 'exec ./test'

    • 如果您想测试屏幕会话是否仍然存在:

    screen -ls

    • 使用ps

    ps aux | grep [s]creen

    • 要附加到正在运行的屏幕会话:

    screen -r test_session

    典型的用户场景是否假设在命令(例如 rsync)执行完成后强制手动终止屏幕会话?

    是的,在典型的使用情况下,当用户不再需要屏幕会话时,他们会手动关闭它。

    您可以通过以下方式进行操作:

    • 附加到会话并使用 exit 或 Ctrl+D 退出
    • 使用 screen -XS quit 从另一个 shell 终止它
    • 其他..

    脚本执行完成后终止屏幕会话

    这可能属于“解决方法”类别,但我能够通过将命令(示例中的“python dostuff.py”)放入 shell 脚本,然后运行来实现我认为您的目标......

    screen -d -m "/path/to/that/script"

    通过 bash 脚本关闭屏幕

    Linux:一旦进程结束,就终止屏幕

    脚本完成后退出屏幕

    “screen -dm” 和 “screen -Dm” 有什么区别

    使用 GNU screen 运行程序,然后立即分离

    • 3

相关问题

  • rsync - 使用 shell 脚本将每个 JPG/jpg 文件从一个硬盘驱动器移动到一个目录

  • tar 目录只发送修改过的文件块

  • 如何复制具有相对重复符号链接的目录树?

  • rsync 排除问题

  • rsync 端口 22 和 873 使用

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