我正在使用 GNU screen 进行远程结对编程。我们将远程用户的本地帐户称为“pairpair”。我的文件中有以下几行.screenrc
:
multiuser on
acladd pairpair
我已经运行了sudo chmod u+s /usr/bin/screen
。但是,当远程用户尝试使用该命令连接到我的屏幕时,screen -r [my_account_name]/[pid_of_screen]
我收到以下消息:
Attach attempt with bad pid(xxx)
错误消息中列出的 pid 与远程用户运行的屏幕进程的 pid 匹配。远程用户的屏幕进程挂起;错误消息消失后,我的屏幕会话继续顺利运行。
我尝试过使用内置的screen
(at /usr/bin/screen
)和screen
MacPorts 提供的版本,但在两种情况下都出现了相同的错误。
这在 OS X 10.5 (Leopard) 上运行良好。
我已经在 Google 上搜索了错误消息,但大多数结果都与 2003 年左右的 BSD 错误有关(已修复)。还有人见过这种现象吗?有人知道如何在 SL 中使屏幕支持多用户吗?
答案1
我不知道您是否还看到了这个,但是我看到了。
Screen 使用信号为零的 kill() 调用来验证 PID。问题的原因在于 kill() 意外失败,错误号为 EPERM。只有当调用进程的 UID 和 EUID 非零且与目标进程的 UID 和 EUID 不匹配时,才会发生这种情况。
在这个特定情况下,所涉及的两个进程的 UID 不同,并且两个进程的继承 EUID 均为零。这没什么问题,但作为 PID 健全性检查的一部分,两个进程的 EUID 都设置为拥有屏幕会话的 UID。在这个特定情况下,即使两个 EUID 相同,kill() 仍会失败,并出现 errno EPERM。
我已将错误 8965041 提交至 bugreport.apple.com。希望这是修复此问题的正确途径。
与此同时,我正在通过编译自己的屏幕二进制文件来解决这个问题,我强制 CheckPid() 返回 0。
答案2
我使用 Snow Leopard 服务器,并且我使用多用户屏幕没有任何问题 - 我exec screen -xRR
在.profile
启动屏幕上使用,而不是使用明确的 PID。
这对你有用吗?如果是的话,这是 PID 语法的问题,而不是多用户屏幕本身的问题
答案3
我使用它screen
进行远程结对编程。我们尝试了一些屏幕共享解决方案,如 iChat、Skype 和 VNC。对于共享文本,发送像素有点过分(而且很难远程读写),尤其是在互联网连接不稳定的情况下。
因为结对编程中已经暗含了很多信任(而且我们有一台共享的计算机),所以这种情况有一个解决方法:
- 创建共享用户帐户(例如“配对”)
- 授予该帐户管理员权限
- 为我要远程配对的用户添加公钥
远程用户现在可以通过 SSH 登录并加入屏幕会话。
感谢irc.freenode.netwwalker
上#screen
的帮助。