Imagemagick 在临时文件夹中创建了大量临时magick文件
我正在使用该库在http处理程序中调整和裁剪图像。它不会在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
/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中包含的任何示例,就不难理解应该在何处调用它们: