linux - 长时间运行的进程远程终止?

标签 linux shell unix process pid

我正在开发一个允许用户在服务器上远程运行 AI 算法的应用程序。其中一些算法需要很长时间。它的设置使得 AJAX 调用提供算法参数并在服务器上启动 C++ 算法。计算的结果和状态通过 AJAX 调用轮询状态文件进行跟踪。该解决方案似乎适用于同时使用该服务的多个用户,但我现在正在寻找一种方法来取消用户浏览器的计算。我有一个停止按钮,可以停止 AJAX 更新服务并停止浏览器和服务器上正在运行的进程之间的任何通信。问题是该进程仍在运行,我想在用户取消操作时释放服务器资源。以下是更多详细信息。

AJAX 调用命中的 web 服务在用户 'tomcat' 下运行,可以通过 ps -U tomcat 列出。算法执行都是'java'的子进程,可以通过ps --ppid ###列出。

浏览器记录当前计算开始的时间(用户系统时间,而不是服务器系统时间)。

从不同位置连接的用户可能会同时进行多项计算,从而导致许多进程具有相同的名称和父进程。

restful 服务通过 java runtime.exec() 执行终端命令。

我对 shell 脚本不是很了解,所以任何帮助将不胜感激。谁能想出一种方法来使用 java 进程对象或 shell 脚本/awk 通过 timestamp(可能是最接近用户系统时间的时间戳..?)或其他方式定位进程?

提前致谢。

--编辑

如果您有 pid...,在 java 中是否有办法获取给定进程的句柄?好像不是。

--编辑

我无法更改服务器上长时间运行的进程的源代码。 :(

最佳答案

您的 AJAX 调用应该操纵某种资源(最方便的是文本文件)充当 semaphore到进程,在轮询的每次迭代中检查该信号量文件是否已设置为停止状态。如果 AJAX 将信号量文件更改为停止,那么进程将停止,因为您的应用程序会检查它并做出相应的响应。这反过来意味着需要将功能编程到您的 Java AI 应用程序中,而不是弄清楚 PID 是什么,然后在操作系统级别将其杀死。当然,前提是您有权访问应用程序的源代码。

当然,信号量不一定是文件,也可以是数据库中的值等,这取决于您的喜好和配置。

关于linux - 长时间运行的进程远程终止?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14345139/

相关文章:

java - 使用 Java 分析系统内存/CPU 统计信息

java - 无法在 struts2 中更改或添加操作

python - 使用 paramiko 的 sftp 时出现 "No such file"错误

c++ - 如何在 system() 中使用通配符表达式

shell - shell 脚本中的 ${varname} 和 $varname 有什么区别

go - 将文件分成几个 block

linux - linux内核中使用的分页和预分页技术

mysql - 如何在 XAMPP 中将默认存储引擎设置为 InnoDB

linux - 从 "w"命令输出中提取正常运行时间值

bash - 执行后续命令/脚本,在当前命令/脚本之后是 ^C