nginx 명령의 출력 내용을 파이프링해 보았습니다
배경.
회사에서 사용하는 웹 서버가 아파치인지 nginx인지 점검할 기회가 있어 버전 정보와 함께 정보를 수집하는 스크립트를 만들고 있다.
각 버전의 정보에는 CLI 명령이 있으므로 쉽게 액세스할 수 있습니다.
$ httpd -v
Server version: Apache/2.2.34 (Unix)
Server built: Nov 1 2017 18:47:16
$ nginx -v
nginx version: nginx/1.18.0
원래 출력된 정보를 파일에 써서 Kintone에 모을 예정이었으나 다른 여분의 부분은 삭제하려고 하기 때문에 파이프로 출력 결과를 Kintonecut
에 전달하고 명령으로 가공한 후 필요한 부분만 추출한다.$ httpd -v | head -n 1 | cut -f 3 -d " "
Apache/2.2.34
Apache는 위에서 말한 바와 같이 버전 정보만 표시하기 때문에nginx도 마찬가지로 가공 추출을 시도했다.$ nginx -v | head -n 1 | cut -f 3 -d " "
nginx version: nginx/1.18.0
하지만 파이프로nginx버전정보가공cut
을 하려고 해도 순조롭게 진행되지 않습니다.awk
명령에서도 시도했지만 결과는 변하지 않았습니다.$ httpd -v | head -n 1 | awk '{print $3}' #Apacheではちゃんと上手くいく
Apache/2.2.34
$ nginx -v | head -n 1 | awk '{print $3}'
nginx version: nginx/1.18.0
이번에 우리는 이런 느낌으로nginx관의 전달 방식을 조사했다.파일 설명자 정보
나는 많은 것을 조사해서 마음에 드는 보도를 발견했다.
Check for gunzip_module compiled or not
nginx -V 2>&1 | grep --color -o 'http_gunzip_module' [1]
이것을 보았을 때, 나는nginx의 출력 형식이 표준 오류 출력이라는 것을 발견했다.
관심의 초점은
2>&1
이다.파일 설명자라고 하는데 주로 일반 UNIX 시스템 OS에서 사용되는 파일 작업의 정수 값입니다.
일반적으로 다음과 같은 세 가지가 유명하다.
파이프 정보
명령 결과를 전달하는 파이프
|
는 다음 명령의 표준 입력에 표준 출력을 맡긴다는 것을 의미한다.따라서
nginx -v
처럼 단순히 표준 오류 출력에 표시된 정보를 파이프라인화하면 후속cut
명령에 전달할 수 없다.첫 번째 명령의 실행 결과를 다음 명령에 전달하기 위해서는 표준 출력 오류를 설정하여 표준 출력과 함께 전달해야 한다.
방금 글의 내용을 되돌려줍니다.
2>&1
는 표준 오류 출력을 표준 출력에 통합한다는 뜻입니다.나는 이 지령의 집행 결과를 실제로 비교해 보면 쉽게 알 수 있을 것이라고 생각한다.
nginx 명령의 실행 비교
$ nginx -V | grep --color -o 'http_gunzip_module' #標準出力の場合
nginx version: nginx/1.18.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --with-compat --pid-path=/var/run/nginx.pid --lock-path=/var/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-stream_ssl_preread_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-http_auth_request_module --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-google_perftools_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --with-ld-opt=' -Wl,-E'
$ nginx -V 2>&1 | grep --color -o 'http_gunzip_module' #標準エラー出力の場合
http_gunzip_module
보시다시피 nginx -v
뒤에 2>&1
를 더하면 출력 결과는 표준 오류 출력과 표준 출력을 함께 다음 명령에 전달합니다.이에 따라 첫 번째nginx의 버전 정보 출력
2>&1
을 명령cut
에 전달하면 추출할 수 있습니다.$ nginx -v 2>&1 | cut -f 3 -d " " #標準エラー出力と標準出力をcutコマンドに引き渡し
nginx/1.18.0
$ nginx -v 2>&1 | head -n 1 | awk '{print $3}' #awsコマンドでもOK
nginx/1.18.0
감상
nginx의 출력 내용을 파이프를 통해 다음 명령으로 전달합니다.
나는 왜nginx의 출력이 표준 오류 출력인지 모르겠다.🤔
추기
트위터에서 메시지를 받았다.
왜 그랬는지 모르겠지만 자바와 같은 표준 오류 출력 배경을 가지고 있습니다.
실제로 표준 오류 출력에 표시되는 CLI 명령도 있을 수 있으므로 런웨이가 불가능하다고 생각되면 표준 오류 출력의 존재를 의심해 볼 수 있습니다.
LT 자료
LT 슬라이드 자료입니다.
참고 문헌
각주
https://www.cyberciti.biz/faq/unix-linux-bsd-display-nginx-version/ ↩︎
Reference
이 문제에 관하여(nginx 명령의 출력 내용을 파이프링해 보았습니다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/yuta28/articles/nginx-output-pipe텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)