推荐学习书目
› 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 · Mar 27, 2021 · 8298 views
    This topic created in 2049 days ago, the information mentioned may be changed or developed.
    nohup python3 test.py &
    网上搜了半天是使用这个命令,但是关闭窗口后进程还是结束了
    网上还说 nohup 按任意键回到 shell,再用 exit 退出,但是关闭窗口后进程还是结束了

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

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

    还是看点 linux 基础吧...
    isSamle
    isSamle
    Mar 27, 2021
    11
    nohup python xxx.py
    cmos
    cmos
    Mar 27, 2021❤️2
    12
    又到了我来安利 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
    ```
    G2bN4dbX9J3ncp0r
    G2bN4dbX9J3ncp0r
    Mar 27, 2021
    13
    supervisord
    systemd
    yungo8
    yungo8
    Mar 27, 2021 via Android
    14
    我用 nohup 没毛病,参考一下 7 楼意见
    aheadlead
    aheadlead
    Mar 27, 2021 via iPhone
    15
    打个 docker image 不香吗
    ipwx
    ipwx
    Mar 27, 2021
    16
    supervisor
    poterliu
    poterliu
    Mar 27, 2021
    17
    Java 启动是这样的,可以参考一下:
    nohup java -jar 应用名 > 日志文件名>&1 &
    wtks1
    wtks1
    Mar 27, 2021 via Android
    18
    命令前加 setsid
    ylz
    ylz
    Mar 27, 2021
    19
    byobu 也很好用
    ling516
    ling516
    OP
    Mar 27, 2021
    20
    @imes 那还是用 systemd
    seakingii
    seakingii
    Mar 27, 2021❤️1
    21
    我喜欢 supervisor
    7gugu
    7gugu
    Mar 27, 2021 via iPhone
    22
    screen
    mingff258
    mingff258
    Mar 27, 2021
    23
    如果是在 VS Code 里面运行 nohup 的话,是会有问题的,使用普通 ssh 客户端执行就行了。
    CodeCodeStudy
    CodeCodeStudy
    Mar 27, 2021
    24
    两种办法:
    1 、你可以把命令写到一个 shell 文件里,比如 run.sh ,然后 chmod +x run.sh ,再然后 ./sh
    2 、敲完 nohup python3 test.py & 命令后,使用 exit 退出,如果使用 xshell 断开连接的话则不行喔
    关键在于,使得进程的父进程 pid 是 1
    imldy
    imldy
    Mar 27, 2021
    25
    systemd 或 tmux 。
    前者适合长期使用,后者适合临时后台运行
    yucongo
    yucongo
    Mar 27, 2021
    26
    tmux 或 pm2

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

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


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

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

    所以要正经部署的话,自己写个 systemd service,就算脚本遇到意外退出了,还可以自动重启
    lylh1987
    lylh1987
    Mar 30, 2021
    69
    pm2 大法好
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1940 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 119ms · UTC 16:32 · PVG 00:32 · LAX 08:32 · JFK 11:32
    ♥ Do have faith in what you're doing.