【发布时间】:2021-11-24 09:08:43
【问题描述】:
我有一个重启脚本,它将杀死并启动 exe。 现在我需要从同一个基于 CPP 的进程中调用该重启脚本。 试着这样称呼它:
{
std::stringstream restartScript;
restartScript << "nohup sh -c /TEST/restart.sh " << "&") ;
std::system(restartScript.str().c_str());
}
也试过了:
{
std::stringstream restartScript;
restartScript << "bash -c /TEST/restart.sh " << "& disown";
std::system(restartScript.str().c_str());
}
虽然进程被杀死,但使用上述选项;似乎一些僵尸线程持有分配的 Websocket 资源,因此在从该进程调用的脚本再次启动 exe 时低于异常。 “asio 侦听错误:系统:98(地址已在使用中)” [exe 正在使用 websocketpp 库并且已经 set_reuse_addr 为真)。
restart.sh 有以下内容:
#!/bin/bash
kill -9 `pidof processA`
sleep 2
/TEST/bin/processA
Websocket监听代码:
void WebSocketServer::run()
{
// Listen on port 9090
m_endpoint.set_reuse_addr(true);
m_endpoint.listen(9090);
m_endpoint.start_accept();
// Start the Asio io_service run loop
m_endpoint.run();
std::cout << "WS Server listening on " << std::endl;
}
例外:
[info] asio listen error: system:98 (Address already in use)
terminate called after throwing an instance of 'websocketpp::exception'
what(): Underlying Transport Error
请提供解决方案:“从 cpp 进程执行重启脚本,这将重启调用它的进程)
【问题讨论】:
-
请编辑您的问题以包含
/TEST/restart.sh的内容,以及您尝试开始收听的代码部分。 -
已更新所需信息,请查看
-
您的进程是否产生任何子进程?报错时,能否使用
netstat或ss查看端口状态? -
没有子进程是从 processA 产生的。是的,即使在从 processA 调用重新启动脚本之后,我也可以看到该端口仍在使用中。注意:如果我直接从终端调用重启脚本,进程会正确重启
-
虽然我可以看到端口被占用,但没有看到进程正在运行,因为“ps -ef”的输出中缺少该条目