查看原文
其他

有一种遗憾,是跑程序却没用上_______

云煮鸡 腾讯云服务器 2022-06-11
前段时间,一位世一大学子骑车的照片传遍全网。
滑动查看学堂路车神(图源:知乎/微博)

骑车带电脑是因为程序没跑完,害怕关闭后盖导致程序中断,三四个小时重新来。


边骑车,边抱着电脑用Linux虚拟环境跑程序,


这让云煮鸡和工友们甚是动容。


大家不禁回想起当年上学时,


通宵开笔记本编译内核,不敢锁屏怕断电断网。



如何在骑车/吃饭/睡觉/约会时,


保证程序运行不断呢?



如果你需要跑程序,却没用上云服务器,


有些满分姿势,可能就要错过了:


无论是长时间的计算任务、编译内核、训练模型,


还是各类的小型网络服务程序等等,


运行在云服务器内,随时随地远程连接操作,


优雅、安全又高效,


更不用担心笔记本锁屏/关机导致程序停止运行。


图源微博

毕竟,

这样骑车,要慢一点;


这样跑程序,要快一点。


服务器准备


首先,我们在腾讯云创建一台可以把玩的云服务器!


我们以轻量应用服务器Lighthouse为例。作为创建过程最简单的云服务器,Lighthouse可以实现一键部署、秒级启动应用以及应用初始化快速配置,方便大家快速上手。


当然,服务器的选择其实有很多,云服务器CVM也是不错的选择。


这里我们创建一台香港地域的镜像为Ubuntu 20.04LTS版本的实例,这是Ubuntu最新的LTS(长期维护)版本,可以体验更多新特性,后续我们也会在这个系统上做些简单实验。

套餐选择上,可以根据自己的需求选择,本教程以4核的套餐举例。


Lighthouse创建页面


创建完成后,我们就可以在实例列表页面看到实例状态。实例状态为运行中时,点击更多->管理即可进入管理页面。我们将在管理页面为我们的Lighthouse主机重置密码,以方便后续的SSH登录。


Lighthouse实例默认仅能从腾讯云控制台免密登录(本质是使用了默认密钥),为了可以后续通过SSH命令进行代理访问,最方便的方法是通过密码登录。

我们需要为实例重置密码,可以在控制台的实例详情页面完成此类操作。

通过「指定用户名」更新lighthouse用户的密码即可。



注意:此步骤需要重启实例。然后即可通过SSH客户端软件验证密码登录了。另外这里也完全可以选择为其他(已创建的)用户更新密码。


初体验


首先需要明确,通过在程序命令后添加 & 执行是完全达不到效果的。因为这只是设置在当前shell中后台运行而已,程序的进程仍然是当前shell的子进程,在当前shell退出(如Ctrl+D或断网时)我们的进程还是会被杀掉。我们需要的是真正的后台运行,达到在连接断开时还能继续执行的目的。


介绍两个最简单的命令,作为一针见效的体验。


setsid

setsid命令的作用是:在一个新的会话运行程序。它可以打开一个新的会话并把它关联到一个进程。这样运行的程序自然和当前的shell会话进程无关了,也不会受其进程生命周期的管理。通过setsid执行程序是后台运行某个程序的最简单的方式之一。


brooke@VM-0-6-ubuntu:~$ setsid dd if=/dev/zero of=/dev/null bs=1Mbrooke@VM-0-6-ubuntu:~$ ps -ef | grep "dd if"brooke 188655 1 99 10:06 ? 00:00:15 dd if=/dev/zero of=/dev/null bs=1Mbrooke 188691 188289 0 10:06 pts/1 00:00:00 grep --color=auto dd ifbrooke@VM-0-6-ubuntu:~$


可以看到,我们的程序(dd命令)的进程被1号进程收养了,即便当前shell退出,也依然会继续执行。注意,这里的ps命令一定要加-ef选项,才能看到整个服务器的全部进程,否则只能看到当前shell会话的进程,是无法列出dd进程的。


nohup

nohup + & 的组合也可达到类似的效果。

brooke@VM-0-6-ubuntu:~$ nohup dd if=/dev/zero of=/dev/null bs=1M &[1] 189691brooke@VM-0-6-ubuntu:~$ nohup: ignoring input and appending output to 'nohup.out'
brooke@VM-0-6-ubuntu:~$ ps -ef | grep "dd if"brooke 189691 188289 99 10:13 pts/1 00:00:06 dd if=/dev/zero of=/dev/null bs=1Mbrooke 189704 188289 0 10:13 pts/1 00:00:00 grep --color=auto dd ifbrooke@VM-0-6-ubuntu:~$ logout# 重新登录brooke@VM-0-6-ubuntu:~$ ps -ef | grep "dd if"brooke 189691 1 99 10:13 ? 00:00:21 dd if=/dev/zero of=/dev/null bs=1Mbrooke    189836  189820  0 10:13 pts/0    00:00:00 grep --color=auto dd if


注意,第一次执行的时候并不会马上成为1号进程的子进程,但会话退出时就会被托管了。再次登录后可以验证。

tmux工具


tmux简介

tmux(terminal multiplexer)是一个终端分屏工具,它可以很方便地进行服务器端多窗口的管理。tmux有几个小概念:
  • 会话(session):即一次tmux的登录会话,一个会话的全部窗口都关闭了会话结束
  • 窗口(window):一个会话下会有多个窗口,有点类似浏览器里的Tab,同一时间只能一个窗口可见
  • 窗格(pane):一个窗口可以再分成多个小窗格,即窗口里那些能看到的横竖的最小分屏单元

一次tmux会话大致如下图,红色标记当前的窗口,蓝色标记了一个工作窗格:



这里重要的点在于:它的连接会话都保存在服务器端,每个tmux会话可以从屏幕终端分离解绑(detach),后续如果需要,可以随时在将这个进行中的会话绑定(attach)到任何新的屏幕终端,即恢复。


当因为网络不稳定、或者客户端主动断开时,tmux仅仅会解绑当前的会话终端,而该会话下的所有运行中的程序不会有任何影响。


tmux操作

你可以通过man tmux了解到绝大部分tmux操作命令,简单举些例子:

# 列出进行中的会话tmux list-sessions
# 绑定至某一会话,即恢复会话tmux attach# 或更简单地:tmux a

tmux会话内部的操作通常是用前缀键(默认时ctrl+b)加上命令键组合完成的。如想从detach当前窗口,先同时按下ctrl和b键,松手,再按下d键即可。


tips: 更改前缀组合键可以在用户主目录的.tmux.conf文件中设置,如改前缀为ctrl+g


set-option -g prefix C-g


列举几个tmux常用的操作:

  • 新建窗口:prefix + c
  • 删除窗口:prefix + x(其实通常用直接Ctrl+D退出方便,但是当程序卡住无法Ctrl+D时,就很有用了)
  • 下一窗口:prefix + n
  • 上一窗口:prefix + p
  • 切换到copy模式:prefix + [ (可以支持翻页,用于看日志很方便,退出按q即可)
  • 垂直分屏:prefix + %
  • 水平分屏:prefix + "
  • 选择分屏:prefix + 方向键

示例:编译Linux内核源码


我们以一个示例演示tmux是如何帮助我们在服务器上安心地执行命令的。


编译Linux内核的过程通常是冗长的,对于一般的笔记本通常要数个小时,虽然在云服务器上可以加速,但也是一个相当长时间的任务。这类工作很适合结合tmux这类终端会话工具来完成。


下载源码

首先,下载解压内核源码:


sudo apt install linux-source-5.4.0mkdir kernelcd kerneltar -xaf /usr/src/linux-source-5.4.0.tar.bz2cd linux-source-5.4.0


你可以尝试修改一些内核代码, 如加些自己的测试标识日志。(可选)


然后是配置:我们直接复制当前系统的配置。如果你是高端玩家,也完全可以通过make menuconfig来细粒度地调整选择每一个kernel配置项。(可选)


cp /boot/config-5.4.0-48-generic .config

内核编译

接下来,我们开始编译:


time make -j4 bindeb-pkg LOCALVERSION=-custom KDEB_PKGVERSION=$(make kernelversion)-$(date +%Y%m%d)

time命令用于结束后输出程序的运行时长,-j4是指定4个线程并行编译,可以更高效地利用多核CPU。


编译内核时的截图如下。注意到,我们这里还用了tmux的水平分屏功能,右边展示了top命令结果,可以看到4个核心都在满负荷地工作。



此时编译开始,各种CC命令开始刷屏。由于我们所有的操作都是在tmux的终端下操作,得益于其服务器端会话保持的功能,我们完全不用担心SSH客户端连接断了导致服务器端的程序/命令执行有任何影响,可以直接关闭SSH客户端,或者(更优雅些)ctrl+b d解绑终端后退出ssh登录会话,都可以高枕无忧。


你可以安心地合上笔记本,骑车出发,约上朋友去尽情地感受这个秋天的第N杯奶茶的浓郁与浪漫吧。


在你73分钟后回来,重新连上服务器tmux -2 a,发现一切尽在掌控:



新内核安装

编译完成后,可以看到父目录出现了几个deb安装包:分别是新内核的headers包、image包、带调试信息的image包以及用户空间library的安装包。


我们通过dpkg -i命令:

sudo dpkg -i ../linux-image-5.4.60-custom_5.4.60-20201013_amd64.deb

就可以像安装普通deb包那样容易地,直接将新内核的vmlinuz、initrd等系统内核启动所需的文件解压至/boot目录。Debian系统这点做得的确是非常的方便和人性化。



最后一步,reboot服务器后登录。我们可以看到内核已经升级到我们刚刚最新编译安装的5.4.60-custom版本了:



至此,任务结束~


看到这里,相信你已经熟悉了通过常用的screen/tmux等终端会话保持工具,或者通过setsid等方法让你的程序长时间地运行在云服务器上了。


从表现上看起来,这样运行的程序已经非常接近后台常驻的服务程序(daemon program/service)了,还有很多更加功能强大的工具,如systemd、pm2、docker等,可以帮助我们daemon化一个应用程序。


从工程实践角度看,这些工具能更好地帮我们管理云服务器上的各类后台服务,我们在后续的教程中还会根据各类场景进行针对性地讲解。



这样,你就可以在Lighthouse实例跑上更多的程序,提升工作效率,然后尽情地出去骑车/吃饭/睡觉/约会吧!


当然,除了用来跑程序,云服务器还能用来做很多有趣的事。


开发/运维


对于开发与运维人员,云服务器可以提供方便的测试环境,同时还可以保障测试系统的持久在线。不受场景的限制随时随地远程登录查看测试情况。


另外开发人员还可以利用云服务器搭建git,最大程度上方便内部或者公司/团队小环境使用。


建站

对于个人,云服务器是完美的建站利器。无论你是技术爱好者或是段子手,都可以按照自己的想法创建一个酷炫的网站或博客,自由发挥你的才能,发布文章、图片、视频等内容,让世界听到你的声音。


云服务器提供独立IP方便远程管理,在线一键更换操作系统则最大程度上提升使用体验。此外各种集成环境如宝塔、LNMP、LAMP等提供了方便快捷的运行环境安装方法;各种CMS(内容管理系统)为我们提供了丰富的模板,大大提高效率并降低了开发成本。



对于企业,云服务器则可以用来搭建官网、社区论坛等。经营性企业在利用电商平台开展营销的同时,自己搭建商城站点作为直销渠道也是长期经营发展的必要手段。


在移动互联网的大趋势下,基于云服务器搭建并提供公众号与微信小程序服务也是企业开展营销推广的不二法门。



小型网站一般部署在单台服务器上即可;当网站业务颇具规模时,单台服务器配置可能无法满足业务要求,这时一般将数据库和网站程序分开部署在不同的服务器上,来分担性能压力。


部署应用


服务器部署一直在APP/小程序/游戏开发全生命周期中扮演着关键角色。


电商、教育、游戏、直播等行业产品都对IT基础建设有着不同的要求。相较于传统IT的后端部署,云服务器能够针对各行业的“痛点”以及企业自身的需求来制定解决方案。



云服务器很好地满足各类APP开发环境,可以搭建特殊环境,同时也能满足应用程序高请求。当前主流的APP、小程序后端都是采用云服务器搭建。


云服务器安全可靠的弹性计算服务、实时扩展或缩减的计算资源,以及按使用资源计费最大程度降低软硬件采购成本,使得越来越多的企业也选择将纷繁复杂的内部业务系统,如ERP、CRM、OA、财务软件等部署到云服务器上。



随着IT行业应用程序部署的不断增加,企业使用云服务器作为独立的数据库应用服务器,并使用云服务器安装数据库服务。


搭建云盘


云盘很好地解决了文件存储和共享的问题。但随着一系列云盘服务的关闭,剩余的云盘服务越来越少。出于商业化的考量,大部分云盘服务商也对非会员用户网速作出了限制。同时,还经常会出现云盘被破解、文件被盗的问题。


何不试试搭建属于自己的个人云盘?利用当前免费开源的自建云盘程序,如ownCloud、NextCloud,在云服务器上即可快速搭建个人或团队同步网盘,实现多客户端和平台的跨设备文件同步、共享、版本控制、团队协作等功能。


这样,我们再也不用担心云盘厂商下载速度慢、会员涨价以及文件安全的问题了。


部署爬虫程序

在完成爬虫任务时,我们经常会遇到一个程序需要运行几小时,甚至几天的情况。


云服务器自带Python爬虫运行环境,跳过复杂的配置操作;所有计算资源可投入运行爬虫,无需占用本地资源。将爬虫程序部署到云服务器上,不仅省力省心,还能最大程度上满足需求。



有奖互动

你有没有和云煮鸡一样

通宵开电脑跑程序的经历?

用上云服务器后

你又有哪些优雅的姿势?

留言分享一下吧!

点赞最高的3位

(截止10月16日18:00)

将各获得怪奇鹅按摩锤🔨一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存