Imagemagick 在临时文件夹中创建了大量临时magick文件

Imagemagick 在临时文件夹中创建了大量临时magick文件,imagemagick,go-imagick,Imagemagick,Go Imagick,我正在使用该库在http处理程序中调整和裁剪图像。它不会在/tmp文件夹中写入任何内容。但正如我所能看到的,很多文件都是在那个文件夹中创建的,它的大小每天都在增长,目前它消耗了分区大小的90%左右。而且,我也看不懂他们的内容。那么,为什么要创建这些文件,它们会在一段时间后被删除,还是我需要手动删除它们 -rw------- 1 ubuntu ubuntu 16M Feb 22 09:46 magick-d6ascKJV -rw------- 1 ubuntu ubuntu

我正在使用该库在http处理程序中调整和裁剪图像。它不会在
/tmp
文件夹中写入任何内容。但正如我所能看到的,很多文件都是在那个文件夹中创建的,它的大小每天都在增长,目前它消耗了分区大小的90%左右。而且,我也看不懂他们的内容。那么,为什么要创建这些文件,它们会在一段时间后被删除,还是我需要手动删除它们

    -rw------- 1 ubuntu ubuntu   16M Feb 22 09:46 magick-d6ascKJV
    -rw------- 1 ubuntu ubuntu   16M Feb 22 09:46 magick-46ccZIfq
    -rw------- 1 ubuntu ubuntu  1.8M Feb 22 09:47 magick-vUET7vyh
    -rw------- 1 ubuntu ubuntu  1.8M Feb 22 09:47 magick-OLkGWTX8
    -rw------- 1 ubuntu ubuntu   15M Feb 22 09:48 magick-LNMV7YvE
    -rw------- 1 ubuntu ubuntu   16M Feb 22 09:49 magick-0LMYt6Kc
    -rw------- 1 ubuntu ubuntu   16M Feb 22 09:50 magick-ceNxX5CY
    -rw------- 1 ubuntu ubuntu   16M Feb 22 09:50 magick-nQ1M3y6I
编辑:

我没有在http处理程序中使用以下两行代码。原因是我找不到任何解释。此外,GoHTTP处理程序工作正常。那么,这些声明的目的是什么

imagick.Initialize() 
defer imagick.Terminate()
我假设有一些理由将它们包括在代码中。所以,在GoHTTP处理程序中。它应该包含在
func main()或
serveHTTP
中的什么位置

func main() {                                           
    myMux := http.NewServeMux()
    myMux.HandleFunc("/", serveHTTP)

    if err := http.ListenAndServe(":8085", myMux); err != nil {
        logFatal("Error when starting or running http server: %v", err)
    }       

}

func serveHTTP(w http.ResponseWriter, r *http.Request) {

}

临时/中间文件应由调用ImageMagick线程自动清理。您正在描述的模式行为暗示了使用ImageMagick的应用程序中的错误

我建议

  • 检查应用程序的错误日志
  • 评估调用代码的错误报告
  • 确保调用了正确的
    imagick.Initialize
    &
    imagick.Terminate
    例程
  • 如果其他方法都不起作用,请使用环境变量
    MAGICK_TMPDIR
    控制imagemagick工件的写入位置

    更新
    imagick.Initialize
    包装底层,并
    imagick.Terminate
    终止例程。它们对于管理ImageMagick运行的环境非常重要。应该在处理任何ImageMagick任务的工作线程上调用它们,因此在您的情况下,
    serveHTTP
    方法。但是对每个HTTP请求执行这样的例程并不是最佳的,如果可能的话,还应该评估一个附加条件

    func serveHTTP(w http.ResponseWriter,r*http.Request){
    //如有要求,将做图像工作
    imagick.Initialize()
    defer imagick.Terminate()
    //…图像处理方法。。。
    //如果结束
    }
    
    实际上,它应该包含在
    func main()中,而不是
    
    func serveHTTP()
    。它意味着对长时间运行的应用程序只调用一次,解决了我的问题

    func main() {   
    
        imagick.Initialize() 
        defer imagick.Terminate()                                        
        myMux := http.NewServeMux()
        myMux.HandleFunc("/", serveHTTP)
    
        if err := http.ListenAndServe(":8085", myMux); err != nil {
            logFatal("Error when starting or running http server: %v", err)
        }       
    
    }
    
    func serveHTTP(w http.ResponseWriter, r *http.Request) {
    
    }
    

    您可以设置一个
    cron
    ,它可以在一天内运行,也可以在清理临时文件夹中的所有临时
    magick
    文件后运行。您也可以使用此联机命令删除所有magick文件


    sudo find/tmp/-name“magick-*”-type f-delete

    你能说出你正在使用哪个版本的ImageMagick吗?版本:ImageMagick 6.9.3-1 Q16 I686这看起来不是特定于Go绑定的,因为在2010年这里提到了它:实际上,我在Go http处理程序imagick.Initialize()defer imagick.Terminate()中没有使用这些行. 原因是我无法理解这些代码的作用是什么,代码运行得非常好,没有给出任何错误。请检查我已更新的问题。您应该添加那些环境设置和拆除方法。它们很重要。terminate方法将清理环境。你能告诉我在哪里加吗。如果是,我正在使用go-Htt处理程序。我应该将其包含在
    func main()
    还是
    serveHTTP
    中。因为如果我将它包含在
    func main()
    defer中,将永远不会调用它。原因是服务器将只启动一次。但它给出以下错误。如果我将其包括在servehtp方法中。其中,当在
    func main()
    错误:
    Memory allocation failed Success'@fatal/tiff.c/UnregisterTIFFImage/2378中声明时,它不会给出错误。
    这些调用不应用于每个工作进程。就像它们在官方的ImageMagick C-API中使用一样,对于长时间运行的应用程序,它们只需调用一次。如果您只需查看Go绑定和官方C-API中包含的任何示例,就不难理解应该在何处调用它们: