如何以sudo权限启动程序并在screen中运行,且可重新连接会话?
如何以sudo权限启动程序并在screen中运行,且可重新连接会话?
哈哈,这个问题我之前也碰到过!本质是sudo的tty验证机制在搞鬼——当你detach screen后,原来的终端会话就被释放了,重新attach时screen会分配新的tty,这时候sudo会触发重新验证,结果验证完成后反而把原来的进程搞崩了。下面给你几个靠谱的解决方案:
方案一:修改sudoers配置,免密运行目标程序
这是最省心的办法,让你的普通用户不需要输入密码就能以root身份运行那个特定程序,这样attach时不会触发密码验证,自然也就不会导致会话终止。- 运行
sudo visudo打开sudoers配置文件(一定要用visudo,它会帮你检查语法错误,避免把系统搞坏) - 在文件末尾添加一行:
你的用户名 ALL=(ALL) NOPASSWD: /绝对路径/到你的/APP - 保存退出后,启动screen的命令就可以改成:
用普通用户直接启动screen,里面运行sudo APP,detach后再attach,会话稳得一批,还不用输密码。screen -dmS SCREEN_NAME sudo /绝对路径/到你的/APP
- 运行
方案二:让整个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的环境下运行,你可以关掉这个限制来解决问题,但这个操作会降低一点安全性,所以要谨慎考虑:- 运行
sudo visudo打开配置文件 - 找到
Defaults requiretty这一行,在前面加个#把它注释掉 - 保存后,你原来用的
sudo -u USER screen -dmS SCREEN_NAME sudo APP命令应该就能正常工作了,attach时输入密码后会话不会终止。
- 运行
另外,你的重启守护进程可以通过screen -list | grep SCREEN_NAME来检查会话是否存在,如果找不到会话就重新启动对应的命令,这样程序崩溃后就能自动重启啦。
备注:内容来源于stack exchange,提问作者CptZsolt
相关产品推荐
相关产品推荐

