Возможно, вы захотите сначала выполнить предварительную обработку.Мой лучший снимок сsed
echo "28/11/2018 06:20:57 PM" | sed -E "s/([0-9]+)\/([0-9]+)\/([0-9]+) ([0-9]+):([0-9]+):([0-9]+) ([APM]{2})/\3\/\2\/\1 \4:\5:\6 \7/g" | xargs -I II date -d II "+%y-%m-%d %H:%M:%S"
Если вы работаете в системе с последней версией ss
(, такой как iproute2-ss190107
в Debian 10 ), вы можете использовать ss
вместоlsof
:
sock=/path/to/socket
ino=$(stat -c 'ino:%i' "$sock") && ss -elx | grep -w "$ino"
sock=/path/to/socket
if ino=$(stat -c 'ino:%i' "$sock") && ss -elx | grep -qw "$ino"
then
# yeah, somebody's listening on $sock
fi
Здесь следует отметить два важных момента:
Реальный адрес сокета Unix — это числовой кортеж device,inode
, , а не имя пути . Если файл сокета перемещен , какой бы сервер его ни прослушивал, он будет доступен по новому пути. Если файл сокета удален , другой сервер может прослушивать тот же путь (, поэтому права доступа к каталогу сокета Unix важны с точки зрения безопасности -). lsof
не справляется с этим и может возвращать неполные/неверные данные.
ss
сам по себе содержит ошибки, и поскольку интерфейс unix_diag
netlink ss
использует, возвращает номер устройства в формате, используемом внутри ядра Linux, но ss
предполагает, что он находится в формате, используемом интерфейсами системных вызовов, такими как stat(2)
, запись dev:
в выводе ss -elx
выше будет управляться. Однако де -коверкать его может быть неразумно, потому что однажды они могут просто решить его починить. Таким образом, единственный способ действий — относиться к dev:
как к чистому мусору и жить с риском иметь два файла сокетов с одним и тем же индексом, но в разных файловых системах, , с которыми приведенный выше тест не может справиться .
Если все вышеперечисленное не имеет значения для вас, вы можете сделать ту же паршивую вещь lsof
делает (сопоставление на пути, к которому сокет был первоначально привязан ), с:
sock=/path/to/socket
ss -elx | grep " $sock "
, который также должен работать на более старых системах, таких как Centos 7. По крайней мере, это имеет то преимущество, что перечисляет только слушающие сокеты;-)
В итоге я сделал вот что:
if ! [[ -S $SSH_AUTH_SOCK && -n "`ss -xa 2>/dev/null | grep -F $SSH_AUTH_SOCK 2>/dev/null`" ]]; then
# task to activate socket listener
fi
Некрасиво, но функционально.