V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
amiwrong123
V2EX  ›  程序员

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

  •  
  •   amiwrong123 · 232 天前 · 5259 次点击
    这是一个创建于 232 天前的主题,其中的信息可能已经有所发展或是发生改变。

    买了一个 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. 如果有其他好的建议,也可以说下,谢谢各位大佬了
    第 1 条附言  ·  232 天前
    哦,对了。目前使用的是 apscheduler 这个库,来实现的 每天定时运行 py 脚本,运行我写的一个 py 函数。反正就和 while(True)是一样的吧。

    我是该使用这种 while(True) 的方式来实现 不停运行,还是应该用其他 方式呢(比如 py 脚本里,不用 while(True),转其他应用程序来控制 每天定时运行)?
    52 条回复    2021-12-31 18:05:13 +08:00
    huyujievip
        1
    huyujievip  
       232 天前 via iPhone
    screen 挺好用
    了解一下 python 的 virtualenvwrapper
    lscho
        2
    lscho  
       232 天前
    1.会
    2.你需要进程管理,比如 supervisor
    3.不建议
    4.不懂,但 anaconda 似乎是跨平台的
    5.建议使用 linux 的话,多熟悉非图形界面的操作
    fanshaohua
        3
    fanshaohua  
       232 天前
    定时任务 crontab?
    你想要图形界面的话,crontab-ui 可以考虑一下.
    https://github.com/alseambusher/crontab-ui
    xuxuxu123
        4
    xuxuxu123  
       232 天前
    4 、做一份 requirement.txt 文件 需要的时候直接 pip install -r requirement.txt 就可以;
    当前 windows 环境的依赖可以通过 pip freeze >requirements.txt 生成 requirement.txt 文件
    vhui
        5
    vhui  
       232 天前 via iPhone
    推荐学一下 docker
    eason1874
        6
    eason1874  
       232 天前
    1 和 2 的问题就是守护进程,可以用 systemd ,给脚本写一个 service 配置文件,可以自动开机启动和 systemctl start/stop/restart 脚本

    3 图形界面就免了,肯定卡

    4 包管理不太清楚,如果是为了重复配置,可以把命令写到 bash 文件,每次安装就执行它,不用重复输入
    indo
        7
    indo  
       232 天前 via iPhone   ❤️ 1
    如果只是为了运行一些 py 、js 、ts 的脚本,可以了解一下青龙。
    github.com/whyour/qinglong
    raycool
        8
    raycool  
       232 天前
    第一个问题 建议 看下 tmux
    imxieke
        9
    imxieke  
       232 天前 via iPhone
    screen service systemd 这应该是比较常见的吧
    imxieke
        10
    imxieke  
       232 天前 via iPhone
    还有 supervisor screen 简单 另外三个需要写配置文件 但会很省心
    Hider5
        11
    Hider5  
       232 天前 via iPhone
    GitHub Action 了解一下
    Davic1
        13
    Davic1  
       232 天前
    可以把你的 python 脚本做成 Linux 的服务, 然后用服务的形式启动.
    Lockeysama
        14
    Lockeysama  
       232 天前
    Docker 比较爽,迟早用的到,不如早点学,本地开发完,build 个 docker image 推到 docker registry ,或者直接拿 Dockerfile 到服务器上 build 一个,再运行就好了,环境都在 docker 里,不影响宿主机,想搞几个版本就搞几个版本
    eoo
        15
    eoo  
       232 天前   ❤️ 1
    PM2 ?
    RudyS
        16
    RudyS  
       232 天前
    docker
    systemd
    tmux
    supervisor
    chrond
    xiaooloong
        17
    xiaooloong  
       231 天前
    装个 apache airflow 来做任务管理?本身就是 python 的,装好后有 web 界面可以操作
    shateiel
        18
    shateiel  
       231 天前
    @eoo 正解
    Privileges
        19
    Privileges  
       231 天前 via Android
    学一下 Docker ,配置好环境后扔服务器上跑就行了,定几个 Contab 用 Docker stop start 来管理服务定时运行,解决以上所有问题,服务商给的性能本来就很拉,老老实实用命令行吧
    7gugu
        20
    7gugu  
       231 天前 via iPhone
    嫌麻烦直接宝塔解决就好了
    wangxin13g
        21
    wangxin13g  
       231 天前
    学 docker 打镜像 本地打完镜像发布下服务端 pull 然后 run 就可以了 别用 pm2 或者 supervisior 这些保活软件 到时候要换服务器麻烦死了
    rimutuyuan
        22
    rimutuyuan  
       231 天前
    nohup
    amiwrong123
        23
    amiwrong123  
    OP
       231 天前
    @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
        24
    1point  
       231 天前
    1 、nohup 最直接简单;有能力可以学习使用 screen 、supervisor 、supervisor
    2 、nohup 挂后台后,没有退出终端可以用 jobs 查看,也可以用 ps 管理; screen 、supervisor 、supervisor 都可以用相关命令查看所有管理的进程
    3 、不建议图形界面
    4 、 @xuxuxu123 说的就很好。导出依赖,在 ubuntu 重新安装就可以了
    kujio
        25
    kujio  
       231 天前
    定义一个 service 来执行你的脚本,
    然后用 systemd 来管理这个 service
    yianing
        26
    yianing  
       231 天前 via Android
    tmux, cronjob, docker 都可以
    lovehigh
        27
    lovehigh  
       231 天前
    直接用 nohup XXX &这个命令挂后台应该最简单了。要关的时候就用 ps 查看,然后 kill 就行了。
    好一点的办法估计就是用 systemd 来管理,不过要写文件。网上看看教程?

    我自己也和你一样买了 3 年的腾讯云,就跑跑 qinglong ,sillygirl 这些,都是一个服务一个 docker 。重启管理比较方便。
    zrc
        28
    zrc  
       231 天前
    1.每个脚本做成 docker 镜像推上去
    zrc
        29
    zrc  
       231 天前
    1.每个脚本做成 docker 镜像推上去
    2. 安装一个 portainer ,用这个来管理 docker
    madlifer
        30
    madlifer  
       231 天前
    守护进程嘛 问题不大 话说我似乎从来没在 linux 上装过图形页面
    Lockeysama
        31
    Lockeysama  
       231 天前
    @amiwrong123 一般不太这么用。比如 vim ,docker 里我都很少用 vim 改东西,一般是直接改好需要改的(代码这些),重新打个 docker 的 image 的 tag ;非要这么搞的话,就 Dockerfile 里用 RUN 装个 vim ( apt 、yum 等,不同的基础 image ,安装命令不同,看你用的是什么基础 image ),cd 、pwd 这些直接用 docker 的就行,不需要特殊处理
    Privileges
        32
    Privileges  
       231 天前
    @amiwrong123 啥啊,我咋没看懂,docker 的容器独立于宿主机,每个容器都可以是一个独立的 Linux 发行版,如果你想在容器里使用 vim 命令,得自己用容器内的包管理命令安装,而不是用声明环境变量来实现,一般像配置文件这种需要修改的东西,都是先在宿主机修改完成后移到容器上,docker copy 命令能把宿主机的文件拷贝到容器内,dockerfile 先放一放吧,老老实实学一下 docker 的基础命令和用法
    2i2Re2PLMaDnghL
        33
    2i2Re2PLMaDnghL  
       231 天前
    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
        34
    2i2Re2PLMaDnghL  
       231 天前
    @amiwrong123 环境变量不能穿透容器,容器内的 /usr/local/bin 和容器外的 /usr/local/bin 根本不通。
    一般来说,Docker 的设计上是不希望你日常 attach 进去的,它更多地是环境复现而不是环境隔离,环境隔离用 LXC 绝对够了。
    wangxin13g
        35
    wangxin13g  
       231 天前
    @amiwrong123 docker 的目的就是为了让容器和宿主机隔离 如果你需要用宿主机的软件 可以在宿主机系统的基础镜像上写 dockerfile 或者在 dockerfile 里加上 yum/apt install 更直接你可以直接下载需要的软件 Build image 的时候 CP 进去
    amiwrong123
        36
    amiwrong123  
    OP
       231 天前
    @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
        37
    docx  
       231 天前 via Android
    如果命令是常驻的,用 systemctl
    amiwrong123
        38
    amiwrong123  
    OP
       231 天前
    @Privileges #19
    >定几个 Contab 用 Docker stop start 来管理服务定时运行

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

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

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

    2-5 ,常驻运行的我一般会上 systemd ,只是配置的时候麻烦,但后续使用方便。
    而你提到的其他那些,要启动运行的话可以把运行脚本丢去 init.d 里面
    Privileges
        40
    Privileges  
       231 天前
    @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 镜像。
    amiwrong123
        41
    amiwrong123  
    OP
       231 天前
    @markgor #39
    hhh ,见笑了。我准备今晚上先用 nohup 配合& 让我的脚本先跑起来再说。

    然后本地 我用 ssh 登录 Vmware 里面的 Ubuntu ,来进行练习。把帖子里大家说的这些,都试一下😂
    adoal
        42
    adoal  
       231 天前 via iPhone
    你需要系统地学习 Linux 服务器知识…
    2i2Re2PLMaDnghL
        43
    2i2Re2PLMaDnghL  
       231 天前
    @amiwrong123 没有大的问题,不过一般来说 systemd 会写 unit file ,另外 supervisord 会自己进行 daemon 化,所以需要让 systemd 能管理它的话需要 pidfile 来着?
    WeiYuanStudio
        44
    WeiYuanStudio  
       231 天前
    如果是占用时间短的脚本任务,推荐一下云函数。例如腾讯云函数,不需要购买云主机。而且免费额度很高。用里面的 cron 定时触发器触发即可。
    NanFengXiangWan
        45
    NanFengXiangWan  
       231 天前
    如果嫌麻烦,直接安装宝塔面板傻瓜式操作,定时任务一劳永逸。
    c1273082756
        46
    c1273082756  
       231 天前
    docker
    markgor
        47
    markgor  
       230 天前
    @amiwrong123 #40
    项目->长期运行的 用 service(systemctl)进行托管,设置 afterNetwork 启动,作用是方便自己启动 /停止 /重启这些项目;
    调试->需要背景运行,nohup 万精油,通过 stdout 重定向把信息输出去日志,长期调试的就去 rc.local 添加上去自动运行,麻烦在于需要停止的时候自己 kill 下它。

    而 screen/tmux 这些我接触很少,因为我们平时有部分服务器是没联网的,这个时候只有 service,systemctl,这些系统默认就带上的才能方便使用,就算退一万步,没有 service 和 systemctl ,还可以 nohup 来跑.....
    adoal
        48
    adoal  
       230 天前
    @markgor 用 nohup 来跑,是(把其它计算机知识视作其它岗位才需要去学的) 24K 氪金纯程序员和(只重视算法的) 24K 氪金数据科学家们的思路……在生产环境的服务器上干活,还是要懂生产环境运维的“行规”才好。
    adoal
        49
    adoal  
       230 天前
    唔,at 错人了……是要 at @amiwrong123
    julyclyde
        50
    julyclyde  
       230 天前
    后台服务建议 systemd
    容器一时爽,等程序崩了就火葬场了,残留文件、故障时候的输出都不好找

    nohup 不带自动切断日志,回头那个文件就会巨大……

    screen/tmux 显然是错误的。把交互式 shell 和后台服务混为一谈,这样容易受环境变量的影响
    amiwrong123
        51
    amiwrong123  
    OP
       230 天前
    @julyclyde #50
    >screen/tmux 显然是错误的。把交互式 shell 和后台服务混为一谈,这样容易受环境变量的影响
    你想说 screen/tmux 最多只是用于 一次性的但可能要执行很久(比如几个小时)的东西呗,像这样需要常驻的服务的话,还是要用 systemd 呗。

    >nohup 不带自动切断日志,回头那个文件就会巨大……
    你说那个自动生成的 out 文件吗,哎,我没去管它呢😂

    >容器一时爽,等程序崩了就火葬场了,残留文件、故障时候的输出都不好找
    不是很懂,因为我还没试过呢😂

    不过我想问一下,可以结合 systemd 和 docker 吗?比如 systemd 启动一个服务,这个服务做的事情就是 启动一个容器?
    julyclyde
        52
    julyclyde  
       230 天前
    @amiwrong123
    systemd 那边环境是独立设置的,无污染。从交互式 shell 进去的话有可能会有额外的环境变量,进程所属的 cgroup 也是归属于用户的 session 的
    不过确实是,一次性就无所谓了,能干完活才是最重要的

    用 systemd 启动容器的话,你可以看看 systemd-machind 。不过这个 systemd 容器和 docker 那个不同,systemd 容器没有 image 体系。
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4141 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 01:43 · PVG 09:43 · LAX 18:43 · JFK 21:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.