1

我在服务器上安装了 Ubuntu 12.04。每个注册用户也被注册为 linux 用户并通过 /etc/security/limits.conf 被限制系统资源访问。

我尝试以注册用户之一的身份运行服务器。该应用程序是一个 nodejs 应用程序 - http://github.com/pocha/terminal-codelearn。它使用https://github.com/chjj/pty.js为来到 nodejs 应用程序的每个用户创建一个伪终端。

该应用程序失败,“forkpty(3) failed”错误指向https://github.com/chjj/pty.js/blob/65dd89fd8f87de914ff1814362918d7bd87c9cbf/src/unix/pty.cc的第 184 行

pid_t pid = pty_forkpty(&master, name, NULL, &winp);

if (pid) {
  for (i = 0; i < argl; i++) free(argv[i]);
  delete[] argv;
  for (i = 0; i < envc; i++) free(env[i]);
    delete[] env;
  free(cwd);
}

switch (pid) {
  case -1:
    return ThrowException(Exception::Error(
    String::New("forkpty(3) failed.")));

我能够在http://nitrous.io上成功部署该应用程序。他们可能与监狱用户有类似的方式。我尝试运行ulimits -a并匹配除挂起信号之外的每个值。不知何故,在我的服务器上,最大挂起信号值不超过 90k 左右,而在 Nitrous 服务器上为 584k。

下面是 Nitrous 服务器的 ulimit -a 输出

ulimit -a

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 548288
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 512
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 256
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

该应用程序在 heroku 上失败,并出现完全相同的错误。

任何人都可以帮助如何使应用程序在我的服务器上运行,就像它在 nitrous.io 上的工作方式一样

4

2 回答 2

0

我知道 heroku 无法 forkpty 是因为它们实际上并没有运行 POSIX,只是非常类似于 posix。所以有些东西,比如 forkpty,就是行不通的。我认为没有办法解决这个问题:(希望有。

于 2013-07-24T04:32:41.943 回答
0

我不确定我是否了解 POSIX 类型。但我发现在我被监禁的环境中没有 /dev/ptmx & /dev/pts/* 。我用谷歌搜索并创建了它们,它开始工作了。

于 2013-07-25T04:56:53.573 回答