繁体   English   中英

如何从 CPP 进程执行脚本,这也会终止该进程

[英]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持久化。 这意味着当您的程序尝试重新启动时,旧套接字仍在监听,因为新进程是旧进程的后代,因此当它尝试监听新进程时会失败。 有两种方法可以解决此问题:

  1. 将重启逻辑移动到进行监听的进程的父进程,而不是在同一个进程中
  2. 在运行重启脚本之前调用m_endpoint.stop_listening()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM