ssh中断导致远端程序运行终止的原理及解决方法

Linux screen命令教程:如何在一个终端窗口中管理多个会话(附实例详解和注意事项) screen是一个全屏窗口管理器,它将物理终端抽象为多个虚拟终端,每个虚拟终端都可以运行一个shell或程序。screen命令可以让你在一个终端窗口中打开多个会话,每个会话都有自己的环境,可以独立运行命令。这对于需要同时运行多个命令的用户来说非常有用。 阅读详情

转自:http://www.ibm.com/developerworks/cn/linux/l-cn-screen/

你是不是经常需要 SSH 或者 telent 远程登录到 Linux 服务器?你是不是经常为一些长时间运行的任务而头疼,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为他们执行的时间太长了。必须等待它执行完毕,在此期间可不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。

元凶:SIGHUP 信号

让我们来看看为什么关掉窗口/断开连接会使得正在运行的程序死掉。

在Linux/Unix中,有这样几个概念:

  • 进程组(process group):一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID。
  • 会话期(session):一个或多个进程组的集合,有唯一一个会话期首进程(session leader)。会话期ID为首进程的ID。
  • 会话期可以有一个单独的控制终端(controlling terminal)。与控制终端连接的会话期首进程叫做控制进程(controlling process)。当前与终端交互的进程称为前台进程组。其余进程组称为后台进程组。

根据POSIX.1定义:

  • 挂断信号(SIGHUP)默认的动作是终止程序。
  • 当终端接口检测到网络连接断开,将挂断信号发送给控制进程(会话期首进程)。
  • 如果会话期首进程终止,则该信号发送到该会话期前台进程组。
  • 一个进程退出导致一个孤儿进程组中产生时,如果任意一个孤儿进程组进程处于STOP状态,发送SIGHUP和SIGCONT信号到该进程组中所有进程。

因此当网络断开或终端窗口关闭后,控制进程收到SIGHUP信号退出,会导致该会话期内其他进程退出。

我们来看一个例子。打开两个SSH终端窗口,在其中一个运行top命令。

[root@tivf09 root]# top

在另一个终端窗口,找到top的进程ID为5180,其父进程ID为5128,即登录shell。

[root@tivf09 root]# ps -ef|grep top
root      5180  5128  0 01:03 pts/0    00:00:02 top
root      5857  3672  0 01:12 pts/2    00:00:00 grep top

使用pstree命令可以更清楚地看到这个关系:

[root@tivf09 root]# pstree -H 5180|grep top
|-sshd-+-sshd---bash---top
            

使用ps-xj命令可以看到,登录shell(PID 5128)和top在同一个会话期,shell为会话期首进程,所在进程组PGID为5128,top所在进程组PGID为5180,为前台进程组。

[root@tivf09 root]# ps -xj|grep 5128
 5126  5128  5128  5128 pts/0     5180 S        0   0:00 -bash
 5128  5180  5180  5128 pts/0     5180 S        0   0:50 top
 3672 18095 18094  3672 pts/2    18094 S        0   0:00 grep 5128

关闭第一个SSH窗口,在另一个窗口中可以看到top也被杀掉了。

[root@tivf09 root]# ps -ef|grep 5128
root     18699  3672  0 04:35 pts/2    00:00:00 grep 5128

如果我们可以忽略SIGHUP信号,关掉窗口应该就不会影响程序的运行了。nohup命令可以达到这个目的,如果程序的标准输出/标准错误是终端,nohup默认将其重定向到nohup.out文件。值得注意的是nohup命令只是使得程序忽略SIGHUP信号,还需要使用标记&把它放在后台运行。

nohup <command> [argument…] &

虽然nohup很容易使用,但还是比较“简陋”的,对于简单的命令能够应付过来,对于复杂的需要人机交互的任务就麻烦了。

其实我们可以使用一个更为强大的实用程序screen。流行的Linux发行版(例如Red Hat Enterprise Linux 4)通常会自带screen实用程序,如果没有的话,可以从GNU screen的官方网站下载。

[root@tivf06 ~]# rpm -qa|grep screen
xscreensaver-4.18-5.rhel4.11
screen-4.0.2-5
            

开始使用Screen

简单来说,Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。在screen中创建一个新的窗口有这样几种方式:

1.直接在命令行键入screen命令

[root@tivf06 ~]# screen

Screen将创建一个执行shell的全屏窗口。你可以执行任意shell程序,就像在ssh窗口中那样。在该窗口中键入exit退出该窗口,如果这是该screen会话的唯一窗口,该screen会话退出,否则screen自动切换到前一个窗口。

2.Screen命令后跟你要执行的程序。

[root@tivf06 ~]# screen vi test.c

Screen创建一个执行vi test.c的单窗口会话,退出vi将退出该窗口/会话。

3.以上两种方式都创建新的screen会话。我们还可以在一个已有screen会话中创建新的窗口。在当前screen窗口中键入C-a c,即Ctrl键+a键,之后再按下c键,screen 在该会话内生成一个新的窗口并切换到该窗口。

screen还有更高级的功能。你可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。例如,我们打开一个screen窗口编辑/tmp/abc文件:

[root@tivf06 ~]# screen vi /tmp/abc

之后我们想暂时退出做点别的事情,比如出去散散步,那么在screen窗口键入C-a d,Screen会给出detached提示:


暂时中断会话
暂时中断会话 

半个小时之后回来了,找到该screen会话:

[root@tivf06 ~]# screen -ls
There is a screen on:
        16582.pts-1.tivf06      (Detached)
1 Socket in /tmp/screens/S-root.

重新连接会话:

[root@tivf06 ~]# screen -r 16582

看看出现什么了,太棒了,一切都在。继续干吧。

你可能注意到给screen发送命令使用了特殊的键组合C-a。这是因为我们在键盘上键入的信息是直接发送给当前screen窗口,必须用其他方式向screen窗口管理器发出命令,默认情况下,screen接收以C-a开始的命令。这种命令形式在screen中叫做键绑定(key binding),C-a叫做命令字符(command character)。

可以通过C-a ?来查看所有的键绑定,常用的键绑定有:


C-a ? C-a w C-a C-a C-a c C-a n C-a p C-a 0..9 C-a a C-a d C-a k C-a [
显示所有键绑定信息
显示所有窗口列表
切换到之前显示的窗口
创建一个新的运行shell的窗口并切换到该窗口
切换到下一个窗口
切换到前一个窗口(与C-a n相对)
切换到窗口0..9
发送 C-a到当前窗口
暂时断开screen会话
杀掉当前窗口
进入拷贝/回滚模式

Screen常用选项

使用键绑定C-a ?命令可以看到, 默认的命令字符(Command key)为C-a,转义C-a(literal ^a)的字符为a:


Screen 常用选项
Screen 常用选项 

因为screen把C-a看作是screen命令的开始,所以如果你想要screen窗口接收到C-a字符,就要输入C-a a。Screen也允许你使用-e选项设置自己的命令字符和转义字符,其格式为:

-exy x为命令字符,y为转义命令字符的字符

下面命令启动的screen会话指定了命令字符为C-t,转义C-t的字符为t,通过C-t ?命令可以看到该变化。

[root@tivf18 root]# screen -e^tt


自定义命令字符和转义字符
自定义命令字符和转义字符 

其他常用的命令选项有:


-c file -d|-D [pid.tty.host] -h num -list|-ls -d -m -r sessionowner/ [pid.tty.host] -S sessionname -v -wipe [match]
使用配置文件file,而不使用默认的$HOME/.screenrc
不开启新的screen会话,而是断开其他正在运行的screen会话
指定历史回滚缓冲区大小为num行
列出现有screen会话,格式为pid.tty.host
启动一个开始就处于断开模式的会话
重新连接一个断开的会话。多用户模式下连接到其他用户screen会话需要指定sessionowner,需要setuid-root权限
创建screen会话时为会话指定一个名字
显示screen版本信息
同-list,但删掉那些无法连接的会话

下例显示当前有两个处于detached状态的screen会话,你可以使用screen -r <screen_pid>重新连接上:

[root@tivf18 root]# screen –ls
There are screens on:
        8736.pts-1.tivf18       (Detached)
        8462.pts-0.tivf18       (Detached)
2 Sockets in /root/.screen.

[root@tivf18 root]# screen –r 8736

如果由于某种原因其中一个会话死掉了(例如人为杀掉该会话),这时screen -list会显示该会话为dead状态。使用screen -wipe命令清除该会话:

[root@tivf18 root]# kill -9 8462
[root@tivf18 root]# screen -ls  
There are screens on:
        8736.pts-1.tivf18       (Detached)
        8462.pts-0.tivf18       (Dead ???)
Remove dead screens with 'screen -wipe'.
2 Sockets in /root/.screen.

[root@tivf18 root]# screen -wipe
There are screens on:
        8736.pts-1.tivf18       (Detached)
        8462.pts-0.tivf18       (Removed)
1 socket wiped out.
1 Socket in /root/.screen.

[root@tivf18 root]# screen -ls  
There is a screen on:
        8736.pts-1.tivf18       (Detached)
1 Socket in /root/.screen.

[root@tivf18 root]#

-d –m 选项是一对很有意思的搭档。他们启动一个开始就处于断开模式的会话。你可以在随后需要的时候连接上该会话。有时候这是一个很有用的功能,比如我们可以使用它调试后台程序。该选项一个更常用的搭配是:-dmS sessionname

启动一个初始状态断开的screen会话:

[root@tivf06 tianq]# screen -dmS mygdb gdb execlp_test

连接该会话:

[root@tivf06 tianq]# screen -r mygdb

管理你的远程会话

先来看看如何使用screen解决SIGHUP问题,比如现在我们要ftp传输一个大文件。如果按老的办法,SSH登录到系统,直接ftp命令开始传输,之后。。如果网络速度还可以,恭喜你,不用等太长时间了;如果网络不好,老老实实等着吧,只能传输完毕再断开SSH连接了。让我们使用screen来试试。

SSH登录到系统,在命令行键入screen。

[root@tivf18 root]# screen

在screen shell窗口中输入ftp命令,登录,开始传输。不愿意等了?OK,在窗口中键入C-a d:


管理你的远程会话
管理你的远程会话 

然后。。退出SSH登录?随你怎样,只要别杀掉screen会话。

是不是很方便?更进一步,其实我们可以利用screen这种功能来管理你的远程会话,保存你所有的工作内容。你是不是每次登录到系统都要开很多窗口,然后每天都要重复打开关闭这些窗口?让screen来帮你“保存”吧,你只需要打开一个ssh窗口,创建需要的screen窗口,退出的时候C-a d“保存”你的工作,下次登录后直接screen -r <screen_pid>就可以了。

最好能给每个窗口起一个名字,这样好记些。使用C-a A给窗口起名字。使用C-a w可以看到这些窗口名字,可能名字出现的位置不同。使用putty:


putty
putty 

使用telnet:


telnet
telnet 

更多Screen功能

Screen提供了丰富强大的定制功能。你可以在Screen的默认两级配置文件/etc/screenrc和$HOME/.screenrc中指定更多,例如设定screen选项,定制绑定键,设定screen会话自启动窗口,启用多用户模式,定制用户访问权限控制等等。如果你愿意的话,也可以自己指定screen配置文件。

以多用户功能为例,screen默认是以单用户模式运行的,你需要在配置文件中指定multiuser on 来打开多用户模式,通过acl*(acladd,acldel,aclchg...)命令,你可以灵活配置其他用户访问你的screen会话。更多配置文件内容请参考screen的man页。


SSH中怎么使用session 登录 | 注册 王佳楠的专栏 谨以此记录研发之道 25 原创 8 转载 0 译文 1 评论 13973 访问 京 ICP 证 070598 号 Copyright © 1999-2016,  youkuaiyun.com, All Rights Reserved 阅读详情

相关推荐

如何关闭终端后保持ssh远程连接运行程序不终止(tmux基本操作)

一般使用服务器都是通过ssh远程访问,一旦代码跑起来不小心关闭终端则代码也会随之终止,原因就在于这种情况下,代码运行的会话和终端是绑定了,终端关闭则程序停止 使用tmux:terminal multiplexer(终端复用器)可以使终端和会话分离(detach),这样关闭终端时运行的程序不会停止 第一步:安装tmux # Ubuntu 或 Debian sudo apt-get install tmux # CentOS 或 Fedora sudo yum install tmux # Mac

hesongzefairy的博客 5037

linux 技巧:使用 screen 管理你的远程会话

 

技术资料库 1926

VS Code Remote-SSH 远程开发实战:Ubuntu + Python3 一体化配置指南

远程开发本质上是将本地编辑体验与远端执行环境无缝融合的技术范式。其核心原理依赖 SSH 协议建立安全隧道,实现文件同步、进程托管与调试通信。技术价值在于规避本地环境碎片化、消除 Python 版本与依赖冲突、统一管理 Docker/虚拟环境等基础设施。典型应用场景包括云服务器 Python 开发、WSL2/VMware 虚拟机高效编码、以及 Django 等 Web 框架的真·远程调试。本文聚焦 VS Code Remote-SSH 插件与 Ubuntu 系统的深度协同,结合 python3 明确版本约束和

weixin_30345577的博客 758

Linux脚本定时循环执行telnet不同IP远程并输入命令

Linux设置定时任务,定时执行脚本命令执行循环telnet不同IP远程并输入命令,并输出日志文件

weixin_41549104的博客 2320

手把手教你用SIMCOM A7670C_FASL模组实现双路MQTT连接阿里云(附完整源码)

本文详细介绍了如何使用SIMCOM A7670C_FASL 4G模组实现双路MQTT连接阿里云,包括硬件配置、开发环境搭建、双路MQTT架构设计及实现细节。通过完整的源码示例和实战指南,帮助开发者快速掌握物联网设备开发中的多路MQTT连接技术,提升工业级应用的开发效率。

weixin_33696822的博客 227

如何理解界面陷阱电荷呢(interface trapped charge)和费米钉扎效应?

如何理解界面陷阱电荷呢?(interface trapped charge) 我们在学半导体物理的时候经常对各种界面态和陷阱分不清楚,然而这却是半导体中最为关键的知识点之一。我这路主要介绍一下如何比较直观地理解界面陷阱电荷,应该也有叫界面态,快态之类的。 在介绍界面陷阱电荷之前,我们可以回顾一下施主(donor)和受主(acceptor)的概念。在si中如果掺杂了n型杂质P,那么P由于最外层电子有5个,有一个电子比较容易跑走,成为自由移动的导电电子,在能带中可以表现为电子从禁带中的能级跃迁到导带,这种情况我

Wang_P_P的博客 3万+

nohup的使用

最近远程连接服务器跑程序的时候,总是碰到本地电脑息屏或者ssh断开导致程序中断,往往一觉醒来不是程序跑完了而是因为各种原因本地中断了。为此想到了nohup这个命令,可以让程序在我本地电脑关机后也可以在远端服务器上面运行。程序一直在远端服务器上面运行,和本地终端无关,即使断开ssh连接或者本地关机也没关系。

qq_53280985的博客 477

保姆级教程:在Win10/Win11上搞定AppScan 10.0.0安装与许可证激活(含常见报错解决)

本文提供AppScan 10.0.0在Win10/Win11上的详细安装与许可证激活指南,涵盖环境准备、分步安装、文件替换技巧及常见报错解决方案。通过专业的安全测试工具部署实践,帮助用户高效完成安装并避免常见陷阱,提升Web应用安全扫描效率。

weixin_30800987的博客 425

Linux ssh远程总是断开问题解决方案

1. 问题现象   ssh连接远程服务器的时候,如果长时间没有操作,远程连接就有可能中断。正在执行的程序和vim等缓冲区数据都会丢失。 2. 解决方案一(server去设置SSH保持连接时间)   设置一个超时的秒数,600秒后终端上没有任何操作便自动断开连接。   基于安全的理由,如果用户连线到 SSH Server 后闲置,SSH Server 会在超过特定时间后自动终止 SSH 连线 a、打开 /etc/ssh/sshd_config 文件,找到一个参数为 ClientAliveCountMax,它是

weixin_43135696的博客 1万+

Simulink仿真模块 -Scope

如果您将 Scope 模块放在具有锁定链接的库或者锁定的库中,当尝试打开示波器窗口时,Simulink 会显示错误。要显示某个库模块中的内部数据,请为库模块添加一个输出端口,然后将此端口连接到您模型中的 Scope 模块。当您在示波器内可视化多个基于帧的信号时,部分帧大小为 1 的信号采样可能不会显示。当在示波器内可视化多个基于帧的信号时,部分帧大小为 1 的信号采样可能不会显示。如果在仿真开始时波形视图关闭,则当在仿真后打开波形视图时,波形视图将显示附加的输入信号的仿真结果。

jk_101的博客 3790

5G/NR 随机接入过程学习总结

对于随机接入过程,NR与LTE之间有相同点,也有不同点,其最大的区别在于触发场景已经Msg1的处理,详情见下文。 第21章 随机接入过程 21.1 随机接入过程事件触发场景 1) 初始接入:UE从RRC_IDLE态到RRC_CONNETTED态; 2) RRC连接重建:以便UE在无线链路失败后重新建立无线连接(期间重建小区可能是UE无线链路失败的小区,也...

欢迎来到小七的博客,这里将带你深入探索5G通信的神秘世界。无论你是通信领域的专业人士还是对这一领域充满好奇心的技术爱好者,这里都有专业协议解读、通信知识普及以及有趣的Python编程内容等你发现。 7万+

Mac 系统 VS Code SSH 远程连接服务器频繁崩溃解决办法适用场景:Mac 上使用 VS Code 的 Remote-SSH 连接远程服务器,过一段时间后窗口崩溃或远程连接断开,弹出“窗口

Mac 上 VS Code Remote-SSH 频繁崩溃或断开时,不要只盯着 SSH 本身。截图中的“窗口意外终止”“crashed”“代码 5”说明 VS Code 本地窗口进程也可能参与了崩溃。关闭硬件加速。清理远端 VS Code Server。配置 SSH keepalive。禁用扩展测试。检查服务器资源。查看 Remote-SSH 日志。一般来说,前面三步就可以解决大部分 Mac + VS Code + Remote-SSH 频繁崩溃或断连的问题。

m0_74887012的博客 996

华为od 面试八股文_数据库_01_含答案

华为od 面试八股文_数据库_01_含答案

MISAYAONE的博客 2166

python结束远端计算机的进程_Paramiko和exec_命令-终止远程进程?

虽然不是最有效的方法,但这应该是可行的。在键盘中断处理程序中,您可以exec_command("killall -u %s tail" % uname)这样:#!/usr/bin/env python2import paramikoimport selectimport timeltime = time.time()# Or use random:# import random# ltime = ...

weixin_39870155的博客 758

2026年全国青少年信息素养大赛算法应用主题赛(C++赛项初赛模拟卷1及答案解析)

2026年全国青少年信息素养大赛算法应用主题赛(C++赛项初赛模拟卷1及答案解析)

王老师青少年编程 2023

一分钟了解OpenSpec (规格)

OpenSpec是由Fission AI开源的轻量级规范驱动开发(SDD, Spec-Driven Development)CLI工具。它专为AI编程助手(如Cursor、Claude Code)设计,核心是**“先约定,后编码”:在AI写代码前,先通过结构化规范文档达成共识,让开发过程可预测、可审计、可协作**。轻量无侵入:单CLI、无依赖、不改造项目、1分钟接入存量友好:增量Spec、不重构旧文档、1→n王者完全可控:每步审查、AI按图施工、零返工协作利器。

h a 6 6 6 c k 为 你解决复杂难题! 2752

告别 Git Clone 三大经典报错:从‘远端挂断’到‘SSL错误’的保姆级排查清单

本文详细解析了Git Clone操作中常见的三大经典报错(远端挂断、SSL错误、文件终止),提供了从网络层到Git配置的全面排查方案。通过分步诊断命令、优化参数设置和协议切换技巧,帮助开发者快速定位并解决代码克隆问题,同时分享企业级环境下的特别处理方案和预防性配置最佳实践。

weixin_30268071的博客 459

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

为什么ssh一关闭,程序就不再运行了?

问题描述 当SSH远程连接到服务器上,然后运行一个程序,eg: ./test.sh, 然后把终端开闭(切断SSH连接)之后,发现该程序中断. 原因 主要元凶: 挂断信号(SIGHUP) 信号 概念介绍 在Linux/Unix中,有这样几个概念: 进程组(process group): 一个或多个进程的集合,每一个进程组有唯一一个进程组ID,即进程组长进程的ID. 会话期(session)...

HappyMrSpring 4074

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Orca SSH 执行边界深度解析:远端/本地职责切分、断线存活模型与 live / unverifiable / exited 判定

本文聚焦 Orca 桌面端 + SSH 远程执行模型下的核心边界问题:哪些工作在远端主机执行、哪些在本地客户端执行,断线后远端工作如何存活,以及如何严格遵守 `live` / `unverifiable` / `exited` 三态词汇体系、避免把“联系不上”误报为“已退出”。读完你会掌握 Orca 的 relay 架构与主机所有权模型,理解为何升级客户端会“孤立”而非“终止”远端终端,并学会一套

gitblog_00984的博客 327

远程控制方案SSH的使用技巧

SSH是目前安全性很高的、专为远程登录会话和其他网络服务提供的协议。利用SSH协议可以有效防止远程管理过程中的信息泄漏问题。最初的SSH协议是由芬兰的一家公司开发的,但因为受版权和加密算法等等的限制,现在很多人都使用OpenSSH,就像它的名字一样,这个软件包也是开放源代码的。

roman_yu的专栏 750

ssh 断开后保持开启的进程继续运行的方法

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34418883的博客 560

SSH连接超时问题解决方案:Miniconda服务器

通过Miniconda与SSH深度配置,解决远程AI开发中常见的连接中断与环境不一致问题。利用Conda管理可复现的Python环境,结合SSH保活机制和tmux会话持久化,打造高效、安全的远程工作流,确保长时间训练任务稳定运行。

weixin_42356162的博客 906

为什么你的VSCode远程调试总是失败?深入剖析连接中断根源

提升VSCode远程调试的连接稳定性,解决频繁断连难题。涵盖SSH配置、网络环境优化与服务器资源分配等核心方法,适用于远程开发、容器调试等场景。有效降低延迟与中断率,提升开发效率,值得收藏。

CodeNexus的博客 1044

告别反复连接,VSCode远程SSH自动重连设置(稀缺实战经验分享)

解决VSCode远程SSH频繁掉线困扰,本文详解vscode远程连接ssh掉线重连设置方法,涵盖配置文件优化与自动重连技巧,适用于服务器不稳或长时间运行场景,提升开发效率。配置简单、稳定可靠,值得收藏。

PoliVein的博客 1306

ssh nohup 和 &

ssh nohup 和 & 你是不是经常需要 SSH 或者 telent 远程登录到 Linux 服务器?你是不是经常为一些长时间运行的任务而头疼,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为他们执行的时间太长了。必须等待它执行完毕,在此期间可不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。 元凶:SIGHUP 信号

Black-REN 1361
上一篇: ASCII码详解
下一篇: 百度运维笔试题整理
ancient_wind
博客等级 码龄18年 14粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值