You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以sudo权限启动程序并在screen中运行,且可重新连接会话?

如何以sudo权限启动程序并在screen中运行,且可重新连接会话?

哈哈,这个问题我之前也碰到过!本质是sudo的tty验证机制在搞鬼——当你detach screen后,原来的终端会话就被释放了,重新attach时screen会分配新的tty,这时候sudo会触发重新验证,结果验证完成后反而把原来的进程搞崩了。下面给你几个靠谱的解决方案:

  • 方案一:修改sudoers配置,免密运行目标程序
    这是最省心的办法,让你的普通用户不需要输入密码就能以root身份运行那个特定程序,这样attach时不会触发密码验证,自然也就不会导致会话终止。

    1. 运行sudo visudo打开sudoers配置文件(一定要用visudo,它会帮你检查语法错误,避免把系统搞坏)
    2. 在文件末尾添加一行:你的用户名 ALL=(ALL) NOPASSWD: /绝对路径/到你的/APP
    3. 保存退出后,启动screen的命令就可以改成:
      screen -dmS SCREEN_NAME sudo /绝对路径/到你的/APP
      
      用普通用户直接启动screen,里面运行sudo APP,detach后再attach,会话稳得一批,还不用输密码。
  • 方案二:让整个screen会话跑在root环境下
    如果你不想改sudoers,也可以直接让screen启动一个root的shell,再在里面运行程序。这样整个会话都是root权限,attach时不会有验证问题:
    自动启动的命令可以这么写:

    screen -dmS SCREEN_NAME sudo -i bash -c "/绝对路径/到你的/APP"
    

    要是手动操作的话,先启动screen,再输入sudo -i进入root shell,然后启动程序就行——不过你要写重启脚本,用上面的命令自动启动就好。attach后你会直接进入root的shell,程序的输出也能正常看到。

  • 方案三:关闭sudo的tty验证要求(谨慎使用)
    sudo默认要求必须在有tty的环境下运行,你可以关掉这个限制来解决问题,但这个操作会降低一点安全性,所以要谨慎考虑:

    1. 运行sudo visudo打开配置文件
    2. 找到Defaults requiretty这一行,在前面加个#把它注释掉
    3. 保存后,你原来用的sudo -u USER screen -dmS SCREEN_NAME sudo APP命令应该就能正常工作了,attach时输入密码后会话不会终止。

另外,你的重启守护进程可以通过screen -list | grep SCREEN_NAME来检查会话是否存在,如果找不到会话就重新启动对应的命令,这样程序崩溃后就能自动重启啦。

备注:内容来源于stack exchange,提问作者CptZsolt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 11:05:28