我的应用程序在Linux上作为后台进程运行.它目前在终端窗口的命令行中启动.
最近一个用户正在执行该应用程序一段时间,它神秘地死了.文本:
杀害
在终端上.这发生了两次.我问是否有人在不同的终端使用kill命令来杀死进程?没有.
在什么条件下Linux会决定杀死我的进程?我相信shell显示"已杀死",因为该进程在收到kill(9)信号后死亡.如果Linux发送了kill信号,系统日志中是否会有消息说明它被杀的原因?
我有一个java应用程序SIG TERM.我想知道发送此信号的进程的pid.
那可能吗?
有时,当我将大型数据集发送到作业时,我的队列工作人员突然退出.
// $taskmetas is an array with other arrays, each subsequent array having 90 properties.
$this->dispatch(new ProcessExcelData($excel_data, $taskmetas, $iteration, $storage_path));
Run Code Online (Sandbox Code Playgroud)
该ProcessExcelData工作类创建使用Excel文件盒/口包.
$taskmetas有880行 - 工作正常$taskmetas有10,000行 - 突然退出第一个示例 - 使用小数据集的队列输出:
forge@user:~/myapp.com$ php artisan queue:work --tries=1
[2017-08-07 02:44:48] Processing: App\Jobs\ProcessExcelData
[2017-08-07 02:44:48] Processed: App\Jobs\ProcessExcelData
Run Code Online (Sandbox Code Playgroud)
第二个示例 - 具有大型数据集的队列输出:
forge@user:~/myapp.com$ php artisan queue:work --tries=1
[2017-08-07 03:18:47] Processing: App\Jobs\ProcessExcelData
Killed
Run Code Online (Sandbox Code Playgroud)
我没有收到任何错误消息,日志为空,并且作业没有failed_jobs像其他错误一样出现在表中.时间限制设置为1小时,内存限制为2GB.
为什么我的队列突然退出?
我正在使用SUSE SLES 11在POWER7系统上运行多程序工作负载(基于SPEC CPU2006基准测试).
有时,工作负载中的每个应用程序都会消耗大量内存,并且总内存占用量超过系统中安装的可用内存(32 GB).
我禁用了交换,否则测量可能会对使用交换的进程产生严重影响.我知道通过这样做,内核,通过OOM杀手,可能会杀死一些进程.那很好.问题是我希望内核杀死的线程退出时出现错误(例如,进程被信号终止).
我有一个框架,启动所有进程,然后等待使用它们
waitpid(pid, &status, 0);
Run Code Online (Sandbox Code Playgroud)
即使一个线程被OOM杀手杀死(我知道因为我在屏幕上和/ var/log/messages中得到了一条消息),所以
WIFEXITED(status);
Run Code Online (Sandbox Code Playgroud)
返回一个,然后是通话
WEXITSTATUS(status);
Run Code Online (Sandbox Code Playgroud)
返回零.因此,我无法区分进程何时正确完成以及何时被OOM杀手杀死.
我做错了吗?你知道如何检测一个进程被OOM杀手杀死的时间.
非常感谢你,
胜利者
PS:我发现这篇文章提出了几乎相同的问题.但是,由于这是一个老帖子,答案不尽如人意,我决定发一个新问题.