解决 Transmission 提示 Unable to save resume file: Too many open files (3) 错误

Photo by Martin Sanchez / Unsplash

最近在用 Transmission web control 的时候 , 文件一大就很容易遇到 Unable to save resume file: Too many open files (3) 错误提示 .
而在 terminal 查看 transmission-daemon 并没有打开多少文件 .
根据在其它地方找到的资料 , 看了下具体的文件限制 .

cat /proc/4222/limits

Limit                     Soft Limit           Hard Limit           Units
Max cpu time              unlimited            unlimited            seconds
Max file size             unlimited            unlimited            bytes
Max data size             unlimited            unlimited            bytes
Max stack size            8388608              unlimited            bytes
Max core file size        0                    unlimited            bytes
Max resident set          unlimited            unlimited            bytes
Max processes             3823                 3823                 processes
Max open files            1024                 1048576              files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks
Max pending signals       3823                 3823                 signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us

可以看到 transmission-daemon soft Max open files 写死了只能是 1024 . 我在 debian 写了系统级 ulimit , 所以不会是系统问题 . 这就很尴尬了 , 根据这里给出的解释 , 新版 tr 没有可设置项 , 写死了 . 这怎么行 , 难道要放弃 tr ???
好在谷狗中文搜索还凑合能用 , 在这里找到了解决方法 .

解决

以下内容参考 飘云博客的文章

用C程序动态的去更改进程的最大文件和socket数量,喜欢折腾朋友可以编译以下C程序:

#include <stdio.h>
#include <sys/time.h>
#include <sys/resource.h>
#include <sys/types.h>
 
int main(int argc, char** argv) {
    pid_t pid;
    struct rlimit new_limit;
    int result;
    if (argc < 2) {
        return 1;
    }
    pid = atoi(argv[1]);
    new_limit.rlim_cur = 60000;
    new_limit.rlim_max = 60000;
    result = prlimit(pid, RLIMIT_NOFILE, &new_limit, NULL);
    return result;
}

群晖不自带GCC编译器,需要自己折腾,比较麻烦,我这边已经编译好了相关的二进制程序,大家拿去可以直接用,使用方法如下:

wget https://dl.777521.xyz/devs/rlimit 
chmod 744 rlimit 
ps -ef|grep trans  #返回的数字即为 pid 
./rlimit 12345
cat /proc/12345/limits

备用下载地址 :

wget https://www.mopsky.com/rlimit

治好了我的腰酸背痛腿抽筋 , 真棒 .

comments powered by Disqus