&-" 0 파일='/data/nginx/llogs/access.log'"/> &-" 0 파일='/data/nginx/llogs/access.log'">

>운영 및 유지보수 >리눅스 운영 및 유지 관리 >쉘은 네트워크 클라이언트 메소드를 구현합니다.

쉘은 네트워크 클라이언트 메소드를 구현합니다.

PHP中文网
PHP中文网원래의
2017-06-20 11:58:161865검색

온라인 접속 로그를 다른 프로그램으로 보내야 받을 수 있어요
파이썬을 이용해 구현할까 고민하기 시작했어요. 파이썬에도 tail -F를 구현하는 방법이 있지만 너무 번거롭고 효율성도 떨어지거든요
I 쉘이 네트워크 클라이언트를 구현할 수 있다는 것을 우연히 발견했습니다. 그리고 단 몇 줄의 코드로 이를 달성할 수 있습니다

먼저 코드:

trap "exec 8<&-;exec 8>&-" 0
file='/data/nginx/llogs/access.log'
exec 8<>/dev/tcp/10.3.0.200/9001
tail -F "$file" | grep --line-buffered "sid">&8

매우 간단합니다. 실제 처리 논리 코드는 단 2줄입니다.
첫 번째 줄은 주로 프로그램 종료 상태를 캡처하고 종료 후 연결을 닫는 것입니다.
두 번째 줄은 로그 파일을 정의합니다.
세 번째 줄은 네트워크 연결을 설정합니다. Linux에는 특수 파일 /dev/(udp|tcp)/가 있습니다. ip/port
해당 네트워크 연결을 설정하기 위해 이 파일을 파일 설명자에 바인딩합니다. 파일 설명자는 3보다 큽니다. 네 번째 줄은 설정된 채널로 데이터를 보냅니다. grep에는 버퍼가 있으므로 기본적으로 데이터를 출력하지 않습니다. 버퍼가 가득 찰 때까지 --line을 추가해야 합니다. -buffered 매개변수, 라인 버퍼링을 사용하세요.
그렇지 않으면 서버에서 수신한 데이터에 줄 바꿈이 발생합니다.

이런 에이전트의 초간단 기능은 성능은 좋지만 단점이 있습니다

에이전트가 서버와 채널을 맺은 후 서버가 끊기면 채널이 끊어지면 에이전트도 끊게 되고 프로그램은 종료됩니다. 종료(tcp 클라이언트에 이 문제가 있습니다. upd 아니요)

또는 네트워크가 좋지 않거나 에이전트가 종료될 수도 있습니다(이번에는 이 문제가 없었습니다. 모두 광섬유 인터넷이었습니다)
그래서 필요합니다 해당 모니터링 프로그램으로 에이전트를 감지하고 이상이 있을 경우 자동으로 재시작하거나, 네트워크 품질이 좋으면 사용을 고려해 보세요
.

위 내용은 쉘은 네트워크 클라이언트 메소드를 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.