Вы можете воспользоваться командой OBJECT IDLETIME , которая возвращает количество секунд, в течение которых объект, хранящийся на указанном ключе, бездействует (не запрашивается операциями чтения или записи).
Пример кода выглядит следующим образом:
#!/bin/sh
redis-cli -p 6379 keys "*" | while read LINE ;
do
val=`redis-cli -p 6379 object idletime $LINE`;
if [ $val -gt $((30 * 24 * 60 * 60)) ];
then
echo "$LINE";
# del=`redis-cli -p 6379 del $LINE`; # be careful with del
# echo $del;
fi
done;
В вашей ситуации вы можете заменить redis-cli -p 6379
на:
redis-cli -h redis_host -p redis_port -a redis_password
Я просмотрел glibc 2.24, который поставляется с Debian 9.
posix _spawnp (и posix _spawn )реализованы как пользовательский -код C режима, а не системный вызов. Он делает следующее:
O_CLOEXEC
. CLONE_VFORK
. vfork ограничивает связь между дочерними и родительскими -здесь в игру вступает канал. ec
в 0. Если чтение завершается успешно, ec
— это код ошибки, отправленный ему потомком. ec
. Я выделил эти слова курсивом, потому что это ошибка.
Когда posix _spawnp выполняет все эти posix_spawn_file_actions_addclose
действия, код glibc достаточно умен, чтобы дублировать конец записи канала, когда он видит действие файла, которое влияет на этот файловый дескриптор.
int p = args->pipe[1];
...
/* Dup the pipe fd onto an unoccupied one to avoid any file
operation to clobber it. */
if ((action->action.close_action.fd == p)
|| (action->action.open_action.fd == p)
|| (action->action.dup2_action.fd == p))
{
if ((ret = __dup (p)) < 0)
goto fail;
p = ret;
}
Проблема в том, что дубликат не дублирует флаг O_CLOEXEC
, поэтому fd передается процессу, который был запущен дочерним процессом, и не будет закрыт, пока этот процесс не завершится. Чтение в родительском элементе не вернется, пока это не произойдет.
Ошибка была исправлена в этой фиксации . Теперь потомок сообщает об успехе или неудаче родителю, используя общую переменную вместо канала.
Если вы застряли с этой версией glibc,вы ничего не можете сделать, кроме как не сообщать posix _spawnp закрыть конец записи канала (вероятно, logfd+2 в вашем примере кода ).