[英]How to execute a script from CPP process which will kill that process also
我有一个重启脚本,它将终止并启动 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 listen error: system:98 (Address already in use)” [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 进程执行重启脚本,这将重启调用它的进程)
默认情况下,文件描述符(包括侦听套接字)由子进程继承并跨exec
持久化。 这意味着当您的程序尝试重新启动时,旧套接字仍在监听,因为新进程是旧进程的后代,因此当它尝试监听新进程时会失败。 有两种方法可以解决此问题:
m_endpoint.stop_listening()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.