【问题标题】:Program works in foreground, but not in background using nohup程序在前台工作,但不在后台使用 nohup
【发布时间】:2013-12-09 09:52:55
【问题描述】:

我目前正在为我的 iOS 游戏编写服务器后端。该服务器是用 C++ 编写的,并在移除的 Ubuntu 服务器上编译和运行。我使用 SSH 通过 SSH 启动服务器

sudo nohup ./mygameserver &

服务器通信是用 TCP 编写的。带有 read-loop 的 main 函数是使用标准 C socket.h/netdb.h/in.h 编写的,并使用 select() 在非阻塞侦听套接字上接受许多用户。

当我通过 SSH 在前台运行服务器时,一切似乎都运行良好。它接收我以正确顺序发送的所有数据包,并带有正确的标头信息。但是,当我使用 nohup 并断开与 SSH 的连接时……一切似乎都崩溃了。当服务器软件在没有 SSH/nohup 模式下运行时,来自用户连接的典型日志如下所示:

CONNECTED TO SQL
Server starting...
Second thread initialized
Entering order loop
Got a new message of type: 0
Got a new message of type: 0
Got a new message of type: 0
Got a new message of type: 0
<this line continues ad infinitum>

我真的不知道为什么。我确保每次打印都转到 nohup.out 而不是 std::cout,并且服务器每 10 秒向 MySQL 发送一次更新以避免超时。

关于这里出了什么问题有什么想法或意见吗?如果您想要一些代码示例,请告诉我,我只是不知道哪些对这个问题特别感兴趣。提前致谢。

【问题讨论】:

  • 但据我所知,nohup“神奇地”将标准输出的 FD 更改为文件 nohup.out。至少它在运行时会打印以下内容:“nohup: ignoring input and appending output to `nohup.out'”。我确实得到了该文件中的输出......我只是没有得到我期望的输出。
  • 您可能想要添加更多日志记录。另外,由于您现在的问题是,实际上无法说出可能是什么问题。除非您将其缩小到某些特定代码,并将该代码包含在问题中,否则我们无法为您提供帮助。

标签: c++ mysql sockets ssh nohup


【解决方案1】:

我发现了问题所在。

在我的服务器程序中,我有一个 readSockets() 函数,它在主服务器循环中调用 select() 之后调用。 readSockets() 函数响应 nohup 在启动时推送到 stdin 的换行符(原因我不知道),事实上,stdin 也是一个连接到文件描述符的 FILE*,我的 readSockets() 函数响应到标准输入作为连接客户端。

这显然使服务器崩溃,因为 stdin 从未刷新(因此每次 select() 返回时都会读取)。这再次阻止了其他用户的线程。

【讨论】:

  • 但是解决方案是什么?找出原因很好,但如何避免呢?
  • 我的解决方案:从 fds 中删除标准输入。
猜你喜欢
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 2012-09-03
  • 2015-05-14
  • 1970-01-01
  • 2020-12-20
  • 2019-02-02
  • 1970-01-01
相关资源
最近更新 更多