nginx 명령의 출력 내용을 파이프링해 보았습니다

9967 단어 Linuxnginxtech

배경.


회사에서 사용하는 웹 서버가 아파치인지 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에서 사용되는 파일 작업의 정수 값입니다.
일반적으로 다음과 같은 세 가지가 유명하다.
  • 0:stdin(표준 입력)
  • 1:sdout(표준 출력)
  • 2:stderr(표준 오류 출력)
  • 1의 표준 출력, 이것은 평상시 출력의 결과입니다. 방금 Apache의 버전 정보 출력은 표준 출력입니다.한편,nginx의 버전 정보는 2의 표준 오류 출력으로 출력됩니다.(표준 입력은 명령을 두드려 컴퓨터에 문자를 전달하고 있음을 의미한다.)

    파이프 정보


    명령 결과를 전달하는 파이프|는 다음 명령의 표준 입력에 표준 출력을 맡긴다는 것을 의미한다.
    따라서 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의 출력이 표준 오류 출력인지 모르겠다.🤔

    추기


    트위터에서 메시지를 받았다.
    왜 그랬는지 모르겠지만 자바와 같은 표준 오류 출력 배경을 가지고 있습니다.
    https://trac.nginx.org/nginx/ticket/592
    실제로 표준 오류 출력에 표시되는 CLI 명령도 있을 수 있으므로 런웨이가 불가능하다고 생각되면 표준 오류 출력의 존재를 의심해 볼 수 있습니다.

    LT 자료


    LT 슬라이드 자료입니다.

    참고 문헌


    https://www.cyberciti.biz/faq/unix-linux-bsd-display-nginx-version/
    https://codezine.jp/article/detail/4836
    https://docs.microsoft.com/ja-jp/cpp/c-runtime-library/stdin-stdout-stderr?view=msvc-160
    https://qiita.com/ritukiii/items/b3d91e97b71ecd41d4ea
    https://www.infraeye.com/study/linuxz15.html
    각주
    https://www.cyberciti.biz/faq/unix-linux-bsd-display-nginx-version/ ↩︎

    좋은 웹페이지 즐겨찾기