You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ssh->exec执行批量邮件推送脚本时进程中断的保活方案咨询

解决SSH执行邮件推送脚本进程中断的方案

当通过SSH执行邮件推送脚本,处理超过10k封邮件时进程无提示停止,主要是SSH会话限制、脚本资源不足或系统资源限制导致的,以下是具体解决方法:

1. 让进程脱离SSH终端会话

SSH会话关闭时,后台运行的进程会收到SIGHUP信号被强制终止。用nohup命令让进程脱离终端、忽略挂断信号,同时把输出重定向到日志文件:

nohup php applications/root/public_html/includes/php/workers/xxx.php > /var/log/mail_push.log 2>&1 &
  • nohup:让进程忽略挂断信号,持续运行
  • > /var/log/mail_push.log:将标准输出写入日志
  • 2>&1:把错误输出重定向到标准输出,统一记录到日志
  • &:让进程在后台运行

2. 解除PHP脚本的运行限制

PHP默认的内存和执行时间限制会中断大任务,需手动调整:

  • 在脚本开头添加代码:
    // 取消内存限制
    ini_set('memory_limit', '-1');
    // 取消执行时间限制
    set_time_limit(0);
    
  • 或在命令行执行时直接指定参数:
    php -d memory_limit=-1 -d max_execution_time=0 your_script.php
    

3. 启用日志排查问题

无提示停止的核心是不知道错误原因,必须记录日志。修改SSH执行的命令,为每个任务生成独立日志:

$ssh = new SSH2('example.com');

if (!$ssh->login('username', 'password')) {
    exceptionErrorHandler("Error logging in to server for " . $queue);
} else {
    $logPath = "/var/log/mail_push_{$queue}.log";
    $command = "nohup php -d memory_limit=-1 -d max_execution_time=0 applications/root/public_html/includes/php/workers/{$queue}.php > {$logPath} 2>&1 &";
    $ssh->exec($command);
}

后续进程停止后,可通过日志查看内存溢出、连接超时等具体原因。

4. 调整系统资源限制

发大量邮件会占用较多文件连接、内存等资源,需调整系统限制:

  • 临时调整打开文件数限制(当前会话有效):
    ulimit -n 65535
    
  • 永久调整:编辑/etc/security/limits.conf,添加:
    username soft nofile 65535
    username hard nofile 65535
    
    替换username为运行脚本的系统用户,重启系统生效。

5. 优化脚本稳定性

  • 分批次处理:不要一次性加载10k+邮件到内存,每次处理1000封,处理完再取下一批,减少内存占用
  • 错误捕获与重试:用try-catch包裹邮件发送逻辑,单个邮件发送失败时重试2-3次,避免脚本整体终止
  • 手动释放内存:处理完一批邮件后,unset不需要的变量,调用gc_collect_cycles()触发垃圾回收

内容的提问来源于stack exchange,提问作者Maheskumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 22:40:42