【问题标题】:How to execute a script from CPP process which will kill that process also如何从 CPP 进程执行脚本,这也会杀死该进程
【发布时间】: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 的内容,以及您尝试开始收听的代码部分。
  • 已更新所需信息,请查看
  • 您的进程是否产生任何子进程?报错时,能否使用netstatss查看端口状态?
  • 没有子进程是从 processA 产生的。是的,即使在从 processA 调用重新启动脚本之后,我也可以看到该端口仍在使用中。注意:如果我直接从终端调用重启脚本,进程会正确重启
  • 虽然我可以看到端口被占用,但没有看到进程正在运行,因为“ps -ef”的输出中缺少该条目

标签: c++ linux websocket


【解决方案1】:

默认情况下,文件描述符(包括侦听套接字)由子进程继承,并在exec 中保持不变。这意味着当您的程序尝试重新启动自己时,旧套接字仍在侦听,因为新进程是旧进程的后代,因此在尝试侦听新进程时会失败。有两种方法可以解决此问题:

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

【讨论】:

  • 正在考虑的进程是一种父进程,所以解决方案#1 似乎不适合我的场景。尝试了解决方案#2,但仍然得到相同的地址使用异常。注意根据“ss”输出:tcp CLOSE-WAIT 1 0 [::1]:9090 [::1]:52166[
  • @CryptoDude 您的进程不是 PID 1,因此即使它本身就是一种父进程,它也可以有父进程。那么#2 呢?
  • 更新了评论。由于这必须在不同的设备上运行并与现有的设计/架构内联,因此在父级下创建此过程不是我这次可以查看的解决方案。解决方案 #2 看起来很酷,但不知道为什么它不是为我的案子工作
猜你喜欢
  • 2016-07-08
  • 2016-01-24
  • 2013-07-24
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 2012-11-22
  • 1970-01-01
相关资源
最近更新 更多