买了一个 150 3 年的腾讯云服务器( 1 核 2g ,Ubuntu Server 18.04.1 LTS 64bit ,50g SSD ),但是现在不怎么会用,主要以前用的都是有界面的 Ubuntu 。第一次用服务器,很多都不会,求大佬指点啦
现在通过 ssh 连上服务器了,也能在上面写代码并运行了(现在 powershell 通过 ssh 连上,并且 vscode 也通过 ssh 连上)。现在我写了一个 需要不停运行的 py 爬虫脚本,它每天定时爬虫,并把爬虫信息发送到我的邮件。在 Windows 上已经测试过 这个脚本,是好用的了。
1
huyujievip 2021-12-29 23:42:56 +08:00 via iPhone
screen 挺好用
了解一下 python 的 virtualenvwrapper |
2
lscho 2021-12-29 23:47:04 +08:00
1.会
2.你需要进程管理,比如 supervisor 3.不建议 4.不懂,但 anaconda 似乎是跨平台的 5.建议使用 linux 的话,多熟悉非图形界面的操作 |
3
fanshaohua 2021-12-29 23:49:23 +08:00
|
4
xuxuxu123 2021-12-29 23:50:52 +08:00
4 、做一份 requirement.txt 文件 需要的时候直接 pip install -r requirement.txt 就可以;
当前 windows 环境的依赖可以通过 pip freeze >requirements.txt 生成 requirement.txt 文件 |
5
vhui 2021-12-29 23:50:57 +08:00 via iPhone
推荐学一下 docker
|
6
eason1874 2021-12-29 23:54:22 +08:00
1 和 2 的问题就是守护进程,可以用 systemd ,给脚本写一个 service 配置文件,可以自动开机启动和 systemctl start/stop/restart 脚本
3 图形界面就免了,肯定卡 4 包管理不太清楚,如果是为了重复配置,可以把命令写到 bash 文件,每次安装就执行它,不用重复输入 |
7
indo 2021-12-29 23:55:32 +08:00 via iPhone 1
如果只是为了运行一些 py 、js 、ts 的脚本,可以了解一下青龙。
github.com/whyour/qinglong |
8
raycool 2021-12-30 00:09:15 +08:00
第一个问题 建议 看下 tmux
|
9
imxieke 2021-12-30 00:12:28 +08:00 via iPhone
screen service systemd 这应该是比较常见的吧
|
10
imxieke 2021-12-30 00:14:02 +08:00 via iPhone
还有 supervisor screen 简单 另外三个需要写配置文件 但会很省心
|
11
Hider5 2021-12-30 01:16:23 +08:00 via iPhone
GitHub Action 了解一下
|
12
zictos 2021-12-30 05:53:07 +08:00
|
13
Davic1 2021-12-30 09:21:09 +08:00
可以把你的 python 脚本做成 Linux 的服务, 然后用服务的形式启动.
|
14
Lockeysama 2021-12-30 09:26:23 +08:00
Docker 比较爽,迟早用的到,不如早点学,本地开发完,build 个 docker image 推到 docker registry ,或者直接拿 Dockerfile 到服务器上 build 一个,再运行就好了,环境都在 docker 里,不影响宿主机,想搞几个版本就搞几个版本
|
15
eoo 2021-12-30 09:31:17 +08:00 1
PM2 ?
|
16
RudyS 2021-12-30 09:33:15 +08:00
docker
systemd tmux supervisor chrond |
17
xiaooloong 2021-12-30 09:46:26 +08:00
装个 apache airflow 来做任务管理?本身就是 python 的,装好后有 web 界面可以操作
|
19
Privileges 2021-12-30 09:59:12 +08:00 via Android
学一下 Docker ,配置好环境后扔服务器上跑就行了,定几个 Contab 用 Docker stop start 来管理服务定时运行,解决以上所有问题,服务商给的性能本来就很拉,老老实实用命令行吧
|
20
7gugu 2021-12-30 10:08:16 +08:00 via iPhone
嫌麻烦直接宝塔解决就好了
|
21
wangxin13g 2021-12-30 10:42:05 +08:00
学 docker 打镜像 本地打完镜像发布下服务端 pull 然后 run 就可以了 别用 pm2 或者 supervisior 这些保活软件 到时候要换服务器麻烦死了
|
22
rimutuyuan 2021-12-30 11:23:36 +08:00
nohup
|
23
amiwrong123 OP @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 吗? (可能问得比较蠢,但我只能晚上回去试试了,所以想问下) |
24
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 重新安装就可以了 |
25
kujio 2021-12-30 12:19:40 +08:00
定义一个 service 来执行你的脚本,
然后用 systemd 来管理这个 service |
26
yianing 2021-12-30 12:51:06 +08:00 via Android
tmux, cronjob, docker 都可以
|
27
lovehigh 2021-12-30 13:23:41 +08:00
直接用 nohup XXX &这个命令挂后台应该最简单了。要关的时候就用 ps 查看,然后 kill 就行了。
好一点的办法估计就是用 systemd 来管理,不过要写文件。网上看看教程? 我自己也和你一样买了 3 年的腾讯云,就跑跑 qinglong ,sillygirl 这些,都是一个服务一个 docker 。重启管理比较方便。 |
28
zrc 2021-12-30 13:30:21 +08:00
1.每个脚本做成 docker 镜像推上去
|
29
zrc 2021-12-30 13:30:47 +08:00
1.每个脚本做成 docker 镜像推上去
2. 安装一个 portainer ,用这个来管理 docker |
30
madlifer 2021-12-30 13:43:45 +08:00
守护进程嘛 问题不大 话说我似乎从来没在 linux 上装过图形页面
|
31
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 的就行,不需要特殊处理
|
32
Privileges 2021-12-30 14:19:40 +08:00
@amiwrong123 啥啊,我咋没看懂,docker 的容器独立于宿主机,每个容器都可以是一个独立的 Linux 发行版,如果你想在容器里使用 vim 命令,得自己用容器内的包管理命令安装,而不是用声明环境变量来实现,一般像配置文件这种需要修改的东西,都是先在宿主机修改完成后移到容器上,docker copy 命令能把宿主机的文件拷贝到容器内,dockerfile 先放一放吧,老老实实学一下 docker 的基础命令和用法
|
33
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 插入符号。 |
34
2i2Re2PLMaDnghL 2021-12-30 14:23:07 +08:00
@amiwrong123 环境变量不能穿透容器,容器内的 /usr/local/bin 和容器外的 /usr/local/bin 根本不通。
一般来说,Docker 的设计上是不希望你日常 attach 进去的,它更多地是环境复现而不是环境隔离,环境隔离用 LXC 绝对够了。 |
35
wangxin13g 2021-12-30 16:04:56 +08:00
@amiwrong123 docker 的目的就是为了让容器和宿主机隔离 如果你需要用宿主机的软件 可以在宿主机系统的基础镜像上写 dockerfile 或者在 dockerfile 里加上 yum/apt install 更直接你可以直接下载需要的软件 Build image 的时候 CP 进去
|
36
amiwrong123 OP @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 的困扰了。 老哥,帮忙看下我的理解对吗,还有上面一个问题。谢啦 |
37
docx 2021-12-30 16:49:19 +08:00 via Android
如果命令是常驻的,用 systemctl
|
38
amiwrong123 OP @Privileges #19
>定几个 Contab 用 Docker stop start 来管理服务定时运行 就是指,https://zhuanlan.zhihu.com/p/226032890 里面的步骤吧 crontab -e */1 * * * * docker restart task1 然后之后把 crontab 设置为 开机启动。 然后我理解,执行 python 脚本.py 的事情,是放到了 刚启动容器时 来做的吧 |
39
markgor 2021-12-30 16:55:57 +08:00
1. nohup 配合& ,可以解决后台运行的问题。但是比较简陋。而且没法处理有交互的程序。
不知道为什么到你这成为了简陋...我觉得这个简直是万精油.... 另外需要交互的也不会丢后台运行吧...... 2-5 ,常驻运行的我一般会上 systemd ,只是配置的时候麻烦,但后续使用方便。 而你提到的其他那些,要启动运行的话可以把运行脚本丢去 init.d 里面 |
40
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 镜像。 |
41
amiwrong123 OP @markgor #39
hhh ,见笑了。我准备今晚上先用 nohup 配合& 让我的脚本先跑起来再说。 然后本地 我用 ssh 登录 Vmware 里面的 Ubuntu ,来进行练习。把帖子里大家说的这些,都试一下😂 |
42
adoal 2021-12-30 18:07:24 +08:00 via iPhone
你需要系统地学习 Linux 服务器知识…
|
43
2i2Re2PLMaDnghL 2021-12-30 18:21:13 +08:00
@amiwrong123 没有大的问题,不过一般来说 systemd 会写 unit file ,另外 supervisord 会自己进行 daemon 化,所以需要让 systemd 能管理它的话需要 pidfile 来着?
|
44
WeiYuanStudio 2021-12-30 18:48:05 +08:00
如果是占用时间短的脚本任务,推荐一下云函数。例如腾讯云函数,不需要购买云主机。而且免费额度很高。用里面的 cron 定时触发器触发即可。
|
45
NanFengXiangWan 2021-12-30 21:15:18 +08:00
如果嫌麻烦,直接安装宝塔面板傻瓜式操作,定时任务一劳永逸。
|
46
c1273082756 2021-12-31 09:35:38 +08:00
docker
|
47
markgor 2021-12-31 10:50:01 +08:00
@amiwrong123 #40
项目->长期运行的 用 service(systemctl)进行托管,设置 afterNetwork 启动,作用是方便自己启动 /停止 /重启这些项目; 调试->需要背景运行,nohup 万精油,通过 stdout 重定向把信息输出去日志,长期调试的就去 rc.local 添加上去自动运行,麻烦在于需要停止的时候自己 kill 下它。 而 screen/tmux 这些我接触很少,因为我们平时有部分服务器是没联网的,这个时候只有 service,systemctl,这些系统默认就带上的才能方便使用,就算退一万步,没有 service 和 systemctl ,还可以 nohup 来跑..... |
48
adoal 2021-12-31 12:46:58 +08:00
@markgor 用 nohup 来跑,是(把其它计算机知识视作其它岗位才需要去学的) 24K 氪金纯程序员和(只重视算法的) 24K 氪金数据科学家们的思路……在生产环境的服务器上干活,还是要懂生产环境运维的“行规”才好。
|
49
adoal 2021-12-31 12:48:09 +08:00
唔,at 错人了……是要 at @amiwrong123
|
50
julyclyde 2021-12-31 14:23:36 +08:00
后台服务建议 systemd
容器一时爽,等程序崩了就火葬场了,残留文件、故障时候的输出都不好找 nohup 不带自动切断日志,回头那个文件就会巨大…… screen/tmux 显然是错误的。把交互式 shell 和后台服务混为一谈,这样容易受环境变量的影响 |
51
amiwrong123 OP @julyclyde #50
>screen/tmux 显然是错误的。把交互式 shell 和后台服务混为一谈,这样容易受环境变量的影响 你想说 screen/tmux 最多只是用于 一次性的但可能要执行很久(比如几个小时)的东西呗,像这样需要常驻的服务的话,还是要用 systemd 呗。 >nohup 不带自动切断日志,回头那个文件就会巨大…… 你说那个自动生成的 out 文件吗,哎,我没去管它呢😂 >容器一时爽,等程序崩了就火葬场了,残留文件、故障时候的输出都不好找 不是很懂,因为我还没试过呢😂 不过我想问一下,可以结合 systemd 和 docker 吗?比如 systemd 启动一个服务,这个服务做的事情就是 启动一个容器? |
52
julyclyde 2021-12-31 18:05:13 +08:00
@amiwrong123
systemd 那边环境是独立设置的,无污染。从交互式 shell 进去的话有可能会有额外的环境变量,进程所属的 cgroup 也是归属于用户的 session 的 不过确实是,一次性就无所谓了,能干完活才是最重要的 用 systemd 启动容器的话,你可以看看 systemd-machind 。不过这个 systemd 容器和 docker 那个不同,systemd 容器没有 image 体系。 |