V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
ling516
V2EX  ›  Python

写了一个 py 想让它在云服务后台运行

  •  
  •   ling516 · 2021-03-27 13:09:30 +08:00 · 6630 次点击
    这是一个创建于 1321 天前的主题,其中的信息可能已经有所发展或是发生改变。
    nohup python3 test.py &
    网上搜了半天是使用这个命令,但是关闭窗口后进程还是结束了
    网上还说 nohup 按任意键回到 shell,再用 exit 退出,但是关闭窗口后进程还是结束了

    求大佬指点
    69 条回复    2021-03-30 11:16:23 +08:00
    lambdafate
        1
    lambdafate  
       2021-03-27 13:13:05 +08:00   ❤️ 5
    强推 screen 命令, 谁用谁知道
    privapps
        2
    privapps  
       2021-03-27 13:16:08 +08:00
    nohup 之后,用
    disown %%

    再试试
    ByteCat
        3
    ByteCat  
       2021-03-27 13:16:21 +08:00
    写成服务运行,懒的话直接 screen
    mmtromsb456
        4
    mmtromsb456  
       2021-03-27 13:18:20 +08:00
    关键词进程守护,相对更加稳定并且在服务意外关闭后可以自动重启
    可以选用一般发行版自带的 systemd,注册一个 systemd 服务进行管理即可,或者环境中已经存在 python 对额外添加包不敏感的话也可以用 supervisor.
    如果没有这些要求的话,简单的使用 screen 命令创建一个 deattach 的 shell 来执行你的命令即可
    johnsona
        5
    johnsona  
       2021-03-27 13:20:42 +08:00 via iPhone
    screen
    Tink
        6
    Tink  
       2021-03-27 13:21:26 +08:00 via Android
    最简单就是你说的这个,然后依次是 screen-tmux-supervisor-systemd 等等
    676529483
        7
    676529483  
       2021-03-27 13:22:45 +08:00   ❤️ 7
    nohuo &是可以的,我觉得应该先检查下 python3 test.py 是否会一直运行
    hertzry
        8
    hertzry  
       2021-03-27 13:27:18 +08:00 via Android
    感觉 7#说的有道理。
    sunhuawei
        9
    sunhuawei  
       2021-03-27 13:28:08 +08:00
    进程管理器 pm2 挺不错的
    ClericPy
        10
    ClericPy  
       2021-03-27 13:32:22 +08:00   ❤️ 2
    按优先级推荐, 场景不一样
    systemd
    supervisord, 如果有时间调度 azkaban, airflow
    tmux

    还是看点 linux 基础吧...
    isSamle
        11
    isSamle  
       2021-03-27 13:38:48 +08:00
    nohup python xxx.py
    imes
        12
    imes  
       2021-03-27 13:45:14 +08:00   ❤️ 2
    又到了我来安利 systemd 的时候了
    按照下面的来,注意一下文件路径即可。

    ```
    [Unit]
    Description=Python Service
    After=multi-user.target
    [Service]
    WorkingDirectory=/path
    User=root
    Type=idle
    ExecStart=/usr/bin/python3 /path/python.py
    Restart=always
    [Install]
    WantedBy=multi-user.target
    ```
    lidashuang
        13
    lidashuang  
       2021-03-27 13:49:11 +08:00
    supervisord
    systemd
    yeqizhang
        14
    yeqizhang  
       2021-03-27 13:52:04 +08:00 via Android
    我用 nohup 没毛病,参考一下 7 楼意见
    aheadlead
        15
    aheadlead  
       2021-03-27 13:53:27 +08:00 via iPhone
    打个 docker image 不香吗
    ipwx
        16
    ipwx  
       2021-03-27 13:57:21 +08:00
    supervisor
    poterliu
        17
    poterliu  
       2021-03-27 13:59:36 +08:00
    Java 启动是这样的,可以参考一下:
    nohup java -jar 应用名 > 日志文件名>&1 &
    wtks1
        18
    wtks1  
       2021-03-27 14:06:03 +08:00 via Android
    命令前加 setsid
    ylz
        19
    ylz  
       2021-03-27 14:17:33 +08:00
    byobu 也很好用
    ling516
        20
    ling516  
    OP
       2021-03-27 14:18:22 +08:00
    @imes 那还是用 systemd
    seakingii
        21
    seakingii  
       2021-03-27 14:18:57 +08:00   ❤️ 1
    我喜欢 supervisor
    7gugu
        22
    7gugu  
       2021-03-27 14:20:35 +08:00 via iPhone
    screen
    mingff258
        23
    mingff258  
       2021-03-27 14:33:07 +08:00
    如果是在 VS Code 里面运行 nohup 的话,是会有问题的,使用普通 ssh 客户端执行就行了。
    CodeCodeStudy
        24
    CodeCodeStudy  
       2021-03-27 14:34:04 +08:00
    两种办法:
    1 、你可以把命令写到一个 shell 文件里,比如 run.sh ,然后 chmod +x run.sh ,再然后 ./sh
    2 、敲完 nohup python3 test.py & 命令后,使用 exit 退出,如果使用 xshell 断开连接的话则不行喔
    关键在于,使得进程的父进程 pid 是 1
    imldy
        25
    imldy  
       2021-03-27 14:34:57 +08:00
    systemd 或 tmux 。
    前者适合长期使用,后者适合临时后台运行
    yucongo
        26
    yucongo  
       2021-03-27 15:21:05 +08:00
    tmux 或 pm2

    喜欢折腾的话还可以装 tmux-resurrect 插件。
    koast
        27
    koast  
       2021-03-27 15:24:40 +08:00 via Android
    @imes 这种配置文件是挺好看的,不过我挺好奇这么多键名,是每次写的时候都要看看文档或者参考一下已有的配置文件?
    chenqh
        28
    chenqh  
       2021-03-27 15:50:12 +08:00
    单机, docker 怎么 pull 呀,registry 放哪里?
    WildCat
        29
    WildCat  
       2021-03-27 16:24:16 +08:00
    tmux?

    tmux attach #0?
    troilus
        30
    troilus  
       2021-03-27 16:28:29 +08:00
    screen 是一个非常有用的命令,提供从单个 SSH 会话中使用多个 shell 窗口(会话)的能力。当会话被分离或网络中断时,screen 会话中启动的进程仍将运行,你可以随时重新连接到 screen 会话。如果你想运行一个持久的进程或者从多个位置连接到 shell 会话,这也很方便。
    SenLief
        31
    SenLief  
       2021-03-27 16:35:15 +08:00
    7 楼的没有问题啊。我的 ddns 就是这样扔到后台的。很长时间了也没挂。
    kaka6
        32
    kaka6  
       2021-03-27 16:38:39 +08:00
    高级点用:supervisor
    简单点用:nohup python test.py &
    chinvo
        33
    chinvo  
       2021-03-27 16:40:31 +08:00 via iPhone
    虚拟 tty 法 screen tumux byobu
    服务法 systemd init.d
    2379920898
        34
    2379920898  
       2021-03-27 16:42:35 +08:00
    nohup ./程序名 & 这样来用就 OK 了。。我发现这么多评论,都没有说道点子上,除了 32 楼
    zhuweiyou
        35
    zhuweiyou  
       2021-03-27 16:48:21 +08:00
    screen
    pm2
    zhoudaiyu
        36
    zhoudaiyu  
       2021-03-27 17:00:07 +08:00 via iPhone
    哪位老哥知道哪里有教程讲 systemd 的 service 文件里面的配置字段啊
    ychost
        37
    ychost  
       2021-03-27 17:10:59 +08:00
    tmux 用起来美滋滋
    Macv1994
        38
    Macv1994  
       2021-03-27 17:17:11 +08:00
    supervisor 也挺不错的 还支持 web 端 如果需要可以参考我写的博客 https://2dogz.cn/blog/article/3/
    epicSoldier
        39
    epicSoldier  
       2021-03-27 17:18:04 +08:00
    exit 退出试一下,不要直接关闭连接窗口
    realpg
        40
    realpg  
       2021-03-27 18:48:17 +08:00
    screen 就完了
    MOONLIGHTT
        41
    MOONLIGHTT  
       2021-03-27 19:00:34 +08:00
    tmux+1
    ronman
        42
    ronman  
       2021-03-27 19:03:23 +08:00 via Android   ❤️ 1
    zengguibo
        43
    zengguibo  
       2021-03-27 19:33:47 +08:00
    nohup python test.py & 绝对可以,如果不行先检查一下你的脚本
    FransicZhang
        44
    FransicZhang  
       2021-03-27 19:44:58 +08:00 via Android
    pm2 它不香嘛
    zhoudaiyu
        45
    zhoudaiyu  
       2021-03-27 20:01:25 +08:00 via iPhone
    @ronman 十分感谢~
    nicevar
        46
    nicevar  
       2021-03-27 20:02:50 +08:00
    大概率是程序写得有问题
    ling516
        47
    ling516  
    OP
       2021-03-27 21:06:50 +08:00
    @nicevar 不是 已经可以了 写的 systemctl
    nutting
        48
    nutting  
       2021-03-27 21:07:55 +08:00 via Android
    看看父进程是啥就能分析出来为啥挂不住了
    yanfany
        49
    yanfany  
       2021-03-27 21:24:14 +08:00
    用 screen
    dapan24678
        50
    dapan24678  
       2021-03-27 21:27:42 +08:00
    个人感觉你还是先看看,不后台运行能跑起来不,很多时候是项目启动时报异常退出了,因为后台运行,异常信息也看不见,确定项目能跑起来了再用这个命令
    cheneydog
        51
    cheneydog  
       2021-03-27 21:48:39 +08:00
    @lambdafate
    @ByteCat
    @7gugu


    我有个问题请教,screen 怎么能一行命令创建并执行?每次都得 screen -dmS xxx 进去运行,然后退出。
    tomari
        52
    tomari  
       2021-03-27 22:05:06 +08:00
    tmux 或者 screen,deep learning 做 train 和 interfere 的时候常用。。
    tomari
        53
    tomari  
       2021-03-27 22:06:06 +08:00
    @tomari inference....搜狗的英文输入法有毒
    ShienPro
        54
    ShienPro  
       2021-03-27 22:29:55 +08:00
    临时用一下的话可以试试 systemd-run

    ```
    systemd-run --unit=py-test python3 /absolute/path/test.py
    ```
    xiaochong0302
        55
    xiaochong0302  
       2021-03-27 22:36:28 +08:00 via iPhone
    关键看你 test.py 里面是不是一次执行就结束了,你写个死循环试试
    leavic
        56
    leavic  
       2021-03-27 23:04:02 +08:00
    supervisor 就很好用
    lithiumii
        57
    lithiumii  
       2021-03-27 23:13:12 +08:00 via Android
    @chenqh Gitlab 可以免费私有镜像,另外其实可以把镜像直接当文件拷来拷去 (docker save 和 load)
    chenqh
        58
    chenqh  
       2021-03-27 23:50:20 +08:00
    @lithiumii 镜像文件太大了,动不动几百 M
    oisadfo
        59
    oisadfo  
       2021-03-28 00:32:40 +08:00
    应该是你的程序有 BUG,自己退出了
    irytu
        60
    irytu  
       2021-03-28 00:35:03 +08:00 via iPhone
    守护进程吧 不过最好弄下 logging 方便看问题 https://pypi.org/project/python-daemon/
    DaGongRen001
        61
    DaGongRen001  
       2021-03-28 10:50:21 +08:00
    nohup XXX &可能会因为环境变量问题导致运行失败,在敲第二下回车时就能看出来退出状态码是否为 0
    www5070504
        62
    www5070504  
       2021-03-28 12:06:02 +08:00
    nohup 还要注意错误的标准错误的重定向问题
    litel
        63
    litel  
       2021-03-28 13:00:58 +08:00
    pm2 大法好
    nodejs 的时候就在用,py 也适用
    julyclyde
        64
    julyclyde  
       2021-03-28 14:55:51 +08:00
    nohup 忽略 HUP 信号并重定向
    & 放后台
    按说这俩都用上之后,退出 ssh 应该是不会导致程序中断的啊……
    虽然不是正规做法,但是应该可以成功使用
    Ealrang
        65
    Ealrang  
       2021-03-28 15:26:53 +08:00
    pm2 非常舒服
    jeeyong
        66
    jeeyong  
       2021-03-28 15:29:31 +08:00
    我是 pm2, 跑了 5 年了快.
    web 系统 nodejs, 业务服务是 python
    都是用 pm2
    julyclyde
        67
    julyclyde  
       2021-03-28 17:35:22 +08:00
    哦。我大概猜到了
    后期版本的 systemd 在用户注销的时候会把残留进程也都关闭
    还是请使用正确的 systemd-run
    SkyGuardian
        68
    SkyGuardian  
       2021-03-28 19:54:20 +08:00
    nohup & 是最简单的,但实际上不能用于部署服务
    之前有一个 python 脚本跑了几个月没事,有天上去发现因为系统的原因 terminated 了

    所以要正经部署的话,自己写个 systemd service,就算脚本遇到意外退出了,还可以自动重启
    lylh1987
        69
    lylh1987  
       2021-03-30 11:16:23 +08:00
    pm2 大法好
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   997 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 21:39 · PVG 05:39 · LAX 13:39 · JFK 16:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.