新人 不会玩服务器,求问几个问题

2021-12-29 23:36:53 +08:00
 amiwrong123

买了一个 150 3 年的腾讯云服务器( 1 核 2g ,Ubuntu Server 18.04.1 LTS 64bit ,50g SSD ),但是现在不怎么会用,主要以前用的都是有界面的 Ubuntu 。第一次用服务器,很多都不会,求大佬指点啦

现在通过 ssh 连上服务器了,也能在上面写代码并运行了(现在 powershell 通过 ssh 连上,并且 vscode 也通过 ssh 连上)。现在我写了一个 需要不停运行的 py 爬虫脚本,它每天定时爬虫,并把爬虫信息发送到我的邮件。在 Windows 上已经测试过 这个脚本,是好用的了。

  1. 第一个问题,如果 Ubuntu 是有界面的,那我直接新开一个 terminal ,然后运行我的 py 脚本,并且一直不关闭这个 terminal ,就实现了我的目的。但现在是无界面的,那么如果我现在通过 Windows 自带的 powershell 来 ssh 登录服务器,然后在 powershell 里 运行我的 py 脚本,但我断开 ssh ,这个 terminal 会关闭的吧?(百度了,好像 nohup 能实现)
  2. 就算解决了这个问题,我以后要是运行了多个不同的脚本,得怎么管理呀,我是要通过 ps 命令来看这些进程吗?比如我想停止某个 一直运行的脚本,修改这个脚本的程序后,再重新运行。
  3. 我这个配置,是不是不建议安装图形界面了?不然太卡了( https://cloud.tencent.com/developer/article/1848352?from=15425 ),毕竟如果有界面的话,我就熟悉多了
  4. Ubuntu 安装 py 包,也都是 pip 一个一个地自己安装的吗,还是有更好的解决方案?我现在 Windows 用的 anaconda 很多包都给我下好了。
  5. 如果有其他好的建议,也可以说下,谢谢各位大佬了
6087 次点击
所在节点    程序员
52 条回复
wangxin13g
2021-12-30 10:42:05 +08:00
学 docker 打镜像 本地打完镜像发布下服务端 pull 然后 run 就可以了 别用 pm2 或者 supervisior 这些保活软件 到时候要换服务器麻烦死了
rimutuyuan
2021-12-30 11:23:36 +08:00
nohup
amiwrong123
2021-12-30 11:54:34 +08:00
@Lockeysama #14
@Privileges #19
@wangxin13g #21
使用 Docker 就解决了 python 环境了呗,比如我本地 windows 弄一个 docker image 后推到 registry.hub.docker.com 这个公共仓库里呗。然后服务器上 docker pull 一下就更新了。

有个小问题问下:
服务器自己安装的程序,是怎么共享给 docker 的呢?我理解是这样的。比如,我在服务器安装了 vim ,然后它安在了 /usr/local/bin 下。所以我应该在 Dockerfile 里面写一句:
ENV PATH /usr/local/bin:$path
这样,我的 docker 镜像里即使没有安装 vim ,进入 docker 容器后,我也可以使用 vim 了吧?

那我想要使用系统自带的程序,比如 cd pwd 这些
我还得在 Dockerfile 里面写一句:
ENV PATH /usr/bin:$path
吗?

(可能问得比较蠢,但我只能晚上回去试试了,所以想问下)
1point
2021-12-30 12:02:59 +08:00
1 、nohup 最直接简单;有能力可以学习使用 screen 、supervisor 、supervisor
2 、nohup 挂后台后,没有退出终端可以用 jobs 查看,也可以用 ps 管理; screen 、supervisor 、supervisor 都可以用相关命令查看所有管理的进程
3 、不建议图形界面
4 、 @xuxuxu123 说的就很好。导出依赖,在 ubuntu 重新安装就可以了
kujio
2021-12-30 12:19:40 +08:00
定义一个 service 来执行你的脚本,
然后用 systemd 来管理这个 service
yianing
2021-12-30 12:51:06 +08:00
tmux, cronjob, docker 都可以
lovehigh
2021-12-30 13:23:41 +08:00
直接用 nohup XXX &这个命令挂后台应该最简单了。要关的时候就用 ps 查看,然后 kill 就行了。
好一点的办法估计就是用 systemd 来管理,不过要写文件。网上看看教程?

我自己也和你一样买了 3 年的腾讯云,就跑跑 qinglong ,sillygirl 这些,都是一个服务一个 docker 。重启管理比较方便。
zrc
2021-12-30 13:30:21 +08:00
1.每个脚本做成 docker 镜像推上去
zrc
2021-12-30 13:30:47 +08:00
1.每个脚本做成 docker 镜像推上去
2. 安装一个 portainer ,用这个来管理 docker
madlifer
2021-12-30 13:43:45 +08:00
守护进程嘛 问题不大 话说我似乎从来没在 linux 上装过图形页面
Lockeysama
2021-12-30 13:55:30 +08:00
@amiwrong123 一般不太这么用。比如 vim ,docker 里我都很少用 vim 改东西,一般是直接改好需要改的(代码这些),重新打个 docker 的 image 的 tag ;非要这么搞的话,就 Dockerfile 里用 RUN 装个 vim ( apt 、yum 等,不同的基础 image ,安装命令不同,看你用的是什么基础 image ),cd 、pwd 这些直接用 docker 的就行,不需要特殊处理
Privileges
2021-12-30 14:19:40 +08:00
@amiwrong123 啥啊,我咋没看懂,docker 的容器独立于宿主机,每个容器都可以是一个独立的 Linux 发行版,如果你想在容器里使用 vim 命令,得自己用容器内的包管理命令安装,而不是用声明环境变量来实现,一般像配置文件这种需要修改的东西,都是先在宿主机修改完成后移到容器上,docker copy 命令能把宿主机的文件拷贝到容器内,dockerfile 先放一放吧,老老实实学一下 docker 的基础命令和用法
2i2Re2PLMaDnghL
2021-12-30 14:20:39 +08:00
1. 由简而陋到繁而全—— nohup ; screen/tmux ; supervisor(e.g. supervisord, systemd, 硬要说 docker 和 k8s 也能当作 supervisor 用);脚本自身进行 daemonize
2. 那你显然需要一个 supervisor ,改好直接 restart 就行 —— 但是不推荐 Python 用 docker/k8s ,因为改完要么得 build 要么就是源代码直接运行,要改库的话就不是很友好。
3. 界面完全可以 X forward 到本地渲染图形。
4. Ubuntu 当然也可以 anaconda ,也可以用 pip install -r requirements.txt 或者 poetry 之流。

各类 scheduler 与 while True 有些区别,主要是 while True 会持续尝试占满一核,scheduler 会向 CPU 插入符号。
2i2Re2PLMaDnghL
2021-12-30 14:23:07 +08:00
@amiwrong123 环境变量不能穿透容器,容器内的 /usr/local/bin 和容器外的 /usr/local/bin 根本不通。
一般来说,Docker 的设计上是不希望你日常 attach 进去的,它更多地是环境复现而不是环境隔离,环境隔离用 LXC 绝对够了。
wangxin13g
2021-12-30 16:04:56 +08:00
@amiwrong123 docker 的目的就是为了让容器和宿主机隔离 如果你需要用宿主机的软件 可以在宿主机系统的基础镜像上写 dockerfile 或者在 dockerfile 里加上 yum/apt install 更直接你可以直接下载需要的软件 Build image 的时候 CP 进去
amiwrong123
2021-12-30 16:15:18 +08:00
@2i2Re2PLMaDnghL #33
1. nohup 配合& ,可以解决后台运行的问题。但是比较简陋。而且没法处理有交互的程序。
2. tmux 可以使得程序在后台运行
3. systemd 。使得我的脚本可以变成 一个 service ,我就可以通过 systemctl start/stop/restart 来控制脚本了。而且也可以设置成开机自启动。 感觉这样做有一个好处,就是 开机自启动,比如 我要用 tmux 的方式,要是服务器重启了,我还得 一个一个脚本地 去通过 tmux 来 启动每个脚本。

# supervisord 二进制启动
supervisord -c /etc/supervisord.conf
# 检查进程
ps aux | grep supervisord

4. 如上,通过二进制启动 supervisord ,在它的配置文件 写一个[program:pacong]的相关配置,这样启动 supervisord 的同时,也会启动我的那个 pacong 脚本。也可以通过 supervisorctl restart programxxx 来重启脚本。但我有个问题,这种方式的话,执行`supervisord -c /etc/supervisord.conf`时,我需要通过 tmux 来执行吗( ssh 连上后直接执行)?

sudo chmod +x /etc/rc.d/init.d/supervisord
sudo chkconfig --add supervisord
sudo chkconfig supervisord on
sudo service supervisord start

5. 如上,把 Surpervisor 设置开机启动及 systemd 方式启动。这样好像就解决了 上面一条 是否要使用 tmux 的困扰了。

老哥,帮忙看下我的理解对吗,还有上面一个问题。谢啦
docx
2021-12-30 16:49:19 +08:00
如果命令是常驻的,用 systemctl
amiwrong123
2021-12-30 16:53:23 +08:00
@Privileges #19
>定几个 Contab 用 Docker stop start 来管理服务定时运行

就是指,https://zhuanlan.zhihu.com/p/226032890 里面的步骤吧
crontab -e
*/1 * * * * docker restart task1

然后之后把 crontab 设置为 开机启动。

然后我理解,执行 python 脚本.py 的事情,是放到了 刚启动容器时 来做的吧
markgor
2021-12-30 16:55:57 +08:00
1. nohup 配合& ,可以解决后台运行的问题。但是比较简陋。而且没法处理有交互的程序。
不知道为什么到你这成为了简陋...我觉得这个简直是万精油....
另外需要交互的也不会丢后台运行吧......

2-5 ,常驻运行的我一般会上 systemd ,只是配置的时候麻烦,但后续使用方便。
而你提到的其他那些,要启动运行的话可以把运行脚本丢去 init.d 里面
Privileges
2021-12-30 17:40:09 +08:00
@amiwrong123

"就是指,https://zhuanlan.zhihu.com/p/226032890 里面的步骤吧"

1. 是的,你把你服务放在容器内运行后,可以用 Crontab 定一个定时任务来启动或停止,类似这样
”30 23 * * * docker stop 容器名“。
2. Docker 也支持在容器启动后自动执行类似 python3 main.py 这样的命令,这样就不需要在启动容器后,还要 exec 进容器启动 python 脚本了。 (这个自行 Google 解决


“然后我理解,执行 Python 脚本.py 的事情,是放到了 刚启动容器时 来做的吧”

1. 是的,你的 Python 脚本和运行环境和依赖都是放在容器内运行,你得在容器内配置环境或直接拉取 Docker hub 上的 Python 镜像。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/825178

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX