今天在啓動一個Java程序時,報了打開文件過多的錯誤,遂ulimit -n
發現是1024,但是同時sysctl -a | grep file-max
看到是一個很大的數15000多,bing得StackOverFlower的回答:https://askubuntu.com/questions/162229/how-do-i-increase-the-open-files-limit-for-a-non-root-user,描述了ulimit命令修改的含義。
進行了如下操作:
1.通過修改在該會話下執行ulimit -n 4096
,來修改文件打開數限制,ulimit -n
顯示爲4096了,說明後面在該會話下啓動的進程文件打開數限制都是4096了,此時啓動程序成功。
2.按照上述鏈接高讚的回答修改/etc/security/limits.conf
,兩行行首都加上*
號,
* soft nofile 102400
* hard nofile 102400
然後修改/etc/pam.d/common-session*
匹配的文件們,附加一行session required pam_limits.so
。 再開新的登錄會話,ulimit -n
時已經是102400了,說明對新的會話已經生效了;但是回到舊的窗口,ulimit -n
仍然是4096
3.那麼此時crontab裏啓動的程序的打開文件數限制是多少呢?我想到,可再crontab裏簡單配置定時運行一個shell腳本,腳本里輸出ulimit -n
到一個文件。我在舊的窗口裏進行此操作,此時觀察到輸出的是102400,說明crontab裏依賴的打開文件數限制和上面修改的/etc/pam.d/common-session-noninteractive
相關。
上述鏈接中有回答的 這個命令值得一記su USER --shell /bin/bash --command "ulimit -n"
我估摸着是/etc/pam.d/cron
中的這行
# Set up user limits from /etc/security/limits.conf.
session required pam_limits.so
PAM到底是個什麼東西?
根據我以前在syslog裏的觀察,pam是和用戶身份認證相關,因爲我發現crontab裏配置的任務命令如果帶了sudo,定時任務得到執行時麼authlog就會有記錄。
這篇中文文章大概講述了PAM的歷史,PAM模塊,配置(如required sufficient optinal
的含義),如何編程使用PAM
https://www.ibm.com/developerworks/cn/linux/l-pam/index.html
https://dzone.com/articles/linux-pam-easy-guide
原來limit可以限制一個用戶的使用系統時的各種資源。。。。