Screen后台执行,防止VPS SSH链接中断

最近在通过SSH链接VPS执行长时间编译工作时,SSH断开后编译停止导致失败,该如何解决这个问题。

发现通过使用Screen虚拟终端管理器,建立新终端,这样进程就可以保留在后台运行,哪怕SSH断开也不会影响。

安装Screen

sudo apt-get install screen

使用Screen

使用Screen比较简单,只需要掌握建立、查询、切换不同终端命令即可。

首先建立新的终端

screen -S newterminal

-S参数后接新终端的名称,替换newterminal为你想要叫的终端名,例如lede

建立后会自动切换到新终端,此时执行命令就在新终端,并且退出SSH连接后,终端依旧保留后台执行。

列出已创建的终端

再第二次SSH链接VPS后,默认进入系统新建的终端,此时执行命令列出后台执行了终端

screen -ls
列出终端

在图中可以看到我有个两个后台执行的终端和终端开始的时间

切换到运行中终端

接下来切换到后台运行中的终端

screen -r newterminal

newterminal为终端名称,可在列表中查看或者直接输入定义终端时取的名称

终端名称相同怎么办?

可以前面图片看到,我的两个终端都叫做lede,那么这里切换应该如何进入某一个喃。

这里切换时我们需要加上可选参数[pid]

screen -r pid.newterminal

pid的值可以在screen -ls中查看

例如现在我切换到第二个名为lede的终端

通过pid选择同名终端
screen -r 106305.lede

切换后可以看到我的这个进程是昨晚编译openwrt的lede

整个执行时间超过4小时,进入终端后可以看到已经编译完成

切换入后台终端

退出Screen终端

退出Screen中建立的终端,回到SSH默认终端

执行

exit
退出Screen终端

显示screen is terminating 退出screen的终端连接,将会回到SSH默认的终端

其他参数

-A  将所有的视窗都调整为目前终端机的大小。
-d <作业名称>  将指定的screen作业关闭。
-h <行数>  指定视窗的缓冲区行数。
-m  即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称>  恢复离线的screen作业。
-R  先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s  指定建立新视窗时,所要执行的shell。
-S <作业名称>  指定screen作业的名称。
-v  显示版本信息。
-x  恢复之前离线的screen作业。
-ls或--list  显示目前所有的screen作业。
-wipe  检查目前所有的screen作业,并删除已经无法使用的screen作业。

其余详情可以到官网查看

GNU’s Screen 官方站点:http://www.gnu.org/software/screen/

ubuntu 查看CPU占用情况

安装使用htop

首先通过apt-get安装一个htop

sudo apt-get install htop

输入root账户密码

安装htop

如果apt-get安装失败,可以下载源码编译安装

https://sourceforge.net/projects/htop/

安装后使用

htop

运行查看CPU占用情况

htop查看进程

通过上下键选择进程,F9可以杀掉进程,F10退出Htop

展现出来的各个项目

  • PID:进行的标识号
  • USER:运行此进程的用户
  • PRI:进程的优先级
  • NI:进程的优先级别值,默认的为0,可以进行调整
  • VIRT:进程占用的虚拟内存值
  • RES:进程占用的物理内存值
  • SHR:进程占用的共享内存值
  • S:进程的运行状况,R表示正在运行、S表示休眠,等待唤醒、Z表示僵死状态
  • %CPU:该进程占用的CPU使用率
  • %MEM:该进程占用的物理内存和总内存的百分比
  • TIME+:该进程启动后占用的总的CPU时间
  • COMMAND:进程启动的启动命令名称

偷懒法

如果只是想查看下进程不想安装新的软件

可以运行系统自带的top,在终端中输入

top
top

让树莓派推送IP到微信

树莓派没连接屏幕情况下,连接网络怎样快速获得IP地址。

查了下网上现在有小屏幕显示、DDNS绑定还有包括让树莓派播放音频把IP地址读出来。

这里准备用Python写一个小程序

之前我一直在用 Server 酱的推送服务,推送消息到微信中,这里想到可以让树莓派每次开机联网后将IP通过 Server 酱推送到微信。

这里需要用到:

  • 1.树莓派(我手里是树莓派4,多少没关系能联网就行)
  • 2.Server酱账号一个
  • 3.Python程序一个

操作步骤

首先到Server酱注册账号,并绑定要接收消息的微信

http://sc.ftqq.com/

可使用GitHub一键登入 ,登录后首先绑定需要接收消息的微信

点击【微信推送】,扫描二维码关注公众号绑定接收微信号

Server酱首页选择微信推送

然后选择发送消息,获取SCKEY

Server酱参数说明

Server酱支持Get或者Post推送消息,这里我们选择Post可以定义标题和内容

接下来准备Python代码(自己瞎写的 能用就行?)

#!/usr/bin/env python
# coding=utf-8

#通过Sever酱推送树莓派IP到微信
#By 沙糖桔

import os
import sys
import time
import socket
import subprocess
import requests
import urllib3
import ssl



def getLocalIP():
    ip = None
    try:
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(('114.114.114.114', 0))
        ip = s.getsockname()[0]
    except:
        name = socket.gethostname()
        ip = socket.gethostbyname(name)
    if ip.startswith("127."):
        cmd = '''/sbin/ifconfig | grep "inet " | cut -d: -f2 | awk '{print $1}' | grep -v "^127."'''
        a = subprocess.Popen(
            cmd,
            shell=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE)
        a.wait()
        out = a.communicate()
        ip = out[0].strip().split("\n")  # 所有的列表
        if len(ip) == 1 and ip[0] == "" or len(ip) == 0:
            return False
        ip = "over".join(ip)
    return ip


def pushtoWx(text,desp):
    s = requests.Session()
    ssl._create_default_https_context = ssl._create_unverified_context  # 关闭SSL证书验证
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.157 Safari/537.36','Content-type': 'application/x-www-form-urlencoded'}
    push_url = r'https://sc.ftqq.com/[替换为你的SCKEY].send'  # Server 推送地址
    values = {'text': text, 'desp': desp}
    rp = s.post(push_url, data=values, headers=headers,verify=False)
    html = rp.text
    print(html)


def push_ip(ip):
    pushtoWx('树莓派地址:'+ip,'')


if __name__ == '__main__':
    count = 0
    time.sleep(10)#开机连接等待十秒钟后执行
    while True:
        ip = getLocalIP()
        print(ip)
        if ip == False:
            print("获取ip错误")
        else:
            count += 1
            push_ip(ip)
        if count == 2:
            break
        time.sleep(3)

然后将脚本加入开机执行

sudo vim /etc/rc.local

在 exit 0 之前添加一行:

sudo /usr/bin/python /home/pi/push_ip_wx.py &

保存后重启树莓派

启动后联网10秒推送消息到微信

Server酱推送的消息
收到的IP地址

拿到IP后就可以SSH、VNC链接树莓派开始玩耍。

树莓派4上手体验

最近在群辉里面用虚拟机弄了一个Openwrt的旁路由,感觉速度提升了很多,又看到树莓派已经出到4了,想弄一台来玩玩。

在万年淘宝找了一家买了一个树莓派4

树莓派4配置感觉可玩性很高,

1个千兆网卡、2个USB3.0、2个USB2.0、WIFI模块支持5G、2个MiniHDIM接口支持同时输出4K,并且最好的是供电接口改为了type-c,一下就感觉高级了许多。

一起买了一套亚克力外壳和一个小散热风扇

安装散热风扇前进系统试了下CPU温度在45°

这个外壳设计很有意思,通过多层亚克力板叠上去,上电进入系统重新看了下温度

#查看系统CPU温度
/opt/vc/bin/vcgencmd measure_temp

加了风扇后温度32°,很完美。

然后将HDIM换下来,用VNC来连接。

明天准备连上ADS-B信号接收,看看头顶飞过的飞机信息。

持续写作

快节奏的社会,碎片化的信息,现在越来越难静下心提高一个技能。

我是个不擅长文字的人,不管是说话还是写作都很弱。

开了站来回折腾了一两周服务器、网络等等,最后发现没有可下笔的内容。

还是给自己立一个Flag:

每周都能持续记录点各种内容

不为别的,希望过几年可以看到自己成长的轨迹。

在知乎之前看到一个问题,匿名回答写了1万字,我自己都觉得有点神奇。

写的是个故事,也可以说是回忆,还有很多朋友留言催更,现在算来也种精力。

现在也开篇新的来写写故事

《那时的网还很慢》

哈哈哈,可能是篇沙雕文。

关闭Chrome QUIC,提升Youtube、Google访问速度

QUIC是什么

在默认的Chrome浏览器中,默认开启了一项QUIC的功能。通常的TCP协议连接需要完成与服务器端的握手操作,而UDP协议是无连接协议,数据发出后默认服务端会收到,但为了保证数据的可靠性需要应用层确认相关情况。

QUIC协议就可以在1-2个数据包中完成连接的建立。

想详细了解,可以看下维基百科中的解释:

https://zh.wikipedia.org/zh-hans/%E5%BF%AB%E9%80%9FUDP%E7%BD%91%E7%BB%9C%E8%BF%9E%E6%8E%A5

Youtube、Google等网站支持QUIC协议,当使用Chrome访问时,默认会尝试QUIC协议连接,不过国内UDP协议可能收运营商网络问题出现丢包,最后反而导致速度下降。

所以如何关闭QUIC

在Chrome地址栏输入

QUIC菜单地址
 chrome://flags/#enable-quic 
QUIC选项

Experimental QUIC Protocol从默认调整为Disable

点击重启,大功告成。

重新打开Google、Youtube的页面速度提升。