我的 inode 一直用完(Ubuntu 14.04)。
在我的根邮件中我收到以下消息:
From [email protected] Sun May 29 04:09:01 2016
Return-Path: <[email protected]>
X-Original-To: root
Delivered-To: [email protected]
Received: by web.site.com (Postfix, from userid 0)
id 7D8B41A230A; Sun, 29 May 2016 04:09:01 -0400 (EDT)
From: [email protected] (Cron Daemon)
To: [email protected]
Subject: Cron <root@web> [ -x /usr/lib/php5/sessionclean ] && /usr/lib/php5/sessionclean
Content-Type: text/plain; charset=ANSI_X3.4-1968
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/root>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=root>
Message-Id: <[email protected]>
Date: Sun, 29 May 2016 04:09:01 -0400 (EDT)
/usr/lib/php5/sessionclean: 12: /usr/lib/php5/sessionclean: php5: not found
我相信最后一部分是指 sessionclean 文件的第 12 行?这里是:
session_config=$(php5 -c /etc/php5/${conf_dir}/php.ini -d "error_reporting='~E_ALL'" -r 'foreach(ini_get_all("session") as $k => $v) echo "$k=".$v["local_value"]."\n";')
我的 php.ini 文件存储在 .../php5/cli/php.ini 中。我甚至编辑了 sessionclean 文件以明确引用 php.ini 文件,尽管运行 sessionclean 命令时的错误停止了,但我的会话仍然没有被清除。
我也正在运行 HHVM,并对我的 HHVM 配置(/etc/hhvm/php.ini)做了一些更改,如下所示:
session.save_handler = files
session.save_path = /var/lib/php5/sessions
session.gc_probability = 0
session.gc_maxlifetime = 1440
我也尝试过编辑 /var/lib/hhvm/sessions 的保存路径并再次运行 sessionclean 命令,但没有效果。
目前,我清理会话的唯一方法是手动使用以下命令:
cd /var/lib/php5 OR .../hhvm
find . -name "sess_*" -print | xargs rm -v
有人有什么想法吗?
答案1
我通过将会话目录更改为 /etc/hhvm/php.ini 中的 /var/lib/php/sessions 解决了这个问题。然后还在 sessionclean 脚本 /usr/lib/php5/sessionclean 中对变量进行硬编码
#!/bin/sh -e
SAPIS="apache2:apache2\napache2filter:apache2\ncgi:php5\nfpm:php5-fpm\n"
# Iterate through all web SAPIs
(
proc_names=""
printf "$SAPIS" | \
while IFS=: read -r conf_dir proc_name; do
if [ -e /etc/php5/cli/php.ini ]; then
# Get all session variables once so we don't need to start PHP to get each config option
session_config=$(/usr/bin/php -c /etc/php5/cli/php.ini -d "error_reporting='~E_ALL'" -r 'foreach(ini_get_all("session") as $k => $v) echo "$k=".$v["local_value"]."\n";')
save_handler=files
save_path=/var/lib/php/sessions
gc_maxlifetime=1440
if [ "$save_handler" = "files" -a -d "$save_path" ]; then
proc_names="$proc_names $proc_name";
printf "%s:%s\n" "$save_path" "$gc_maxlifetime"
fi
fi
done
# first find all open session files and touch them (hope it's not massive amount of files)
for pid in $(pidof $proc_names); do
find "/proc/$pid/fd" -ignore_readdir_race -lname "$save_path/sess_\*" -exec touch -c {} \;
done
) | sort -rn -t: -k2,2 | sort -u -t: -k 1,1 | while IFS=: read -r save_path gc_maxlifetime; do
# find all files older then maxlifetime and delete them
find -O3 "$save_path" -depth -mindepth 1 -name 'sess_*' -ignore_readdir_race -type f -cmin "+$gc_maxlifetime" -delete
done
exit 0