Linux 명령 및 셸 기술
Bash 스크립팅: '내 상자에서 작동'부터 프로덕션까지
Bash는 작업이 복잡할 때 슬롯을 얻습니다. 명령을 조정하고 간단한 텍스트를 조정하고 상자에 완전히 머물 수 있습니다. 업계 평판은 아이디어가 아니라 착륙에서 비롯됩니다. 변수 하나가 설정되지 않았거나 하나의 파일 이름에 공백이 있는 서버의 cron에 테스트되지 않은 파이프라인이 제공되었습니다. 이 규율은 기계적이고 비용이 적게 들며 엄격 모드, 인용, 쉘체크, 나중에 운영팀이 읽을 방식에 따른 로깅의 네 부분으로 구성됩니다.
핵심 내용
- 모든 심각한 스크립트는 set -euo Pipefail로 열립니다. 설정되지 않은 변수가 실패하고 명령 실패로 인해 스크립트가 중지되고 파이프라인이 표면에 놓입니다. 그렇지 않으면 오류가 프로덕션에 도달할 때까지 조용히 전달됩니다.
- 변수 및 명령 대체를 인용합니다: "$var" 및 "$(cmd)"; 공백에서 단어 분할은 역대 고전이며 일부 사이트에서 권장하는 IFS 조작은 기억하기로 선택한 버그입니다.
- 중괄호 확장은 변수 앞에 발생합니다. rm -rf "${CLEANUP:?}"/{a,b} with CLEANUP unset은 의도한 것과 다르게 확장되어 유지하려는 항목을 제거합니다. ${VAR:?} 검사는 한 번 배워 볼 가치가 있는 rm 안전 관용어입니다.
- shellcheck는 모든 변경 사항에서 그 자리를 차지합니다. 인용되지 않은 glob, 접근할 수 없는 코드 및 공백이 있는 파일 이름을 먹는 'for f in $(ls)' 패턴을 포착합니다. CI에서 실행하면 버그가 cron에 도달하지 않습니다.
- 임시 작업과 정리가 쌍을 이룹니다. TMP=$(mktemp -d), 'rm -rf "$TMP"' EXIT 트랩, 고아 스크래치 디렉토리가 없고 모든 분기에 '오류가 발생한 경우 제거' 스프링클도 없습니다.
- Read는 안전한 방법으로 반복합니다. while IFS= read -r -d '' f는 find -print0;을 통해 줄 바꿈과 공백이 있는 파일 이름을 처리합니다. 'for f in $(ls)'는 버그 shellcheck 플래그이며 모든 곳의 오래된 스크립트가 여전히 가지고 있습니다.
- 종료 코드와 로그는 ops에 전달됩니다. 단계 이름을 사용하여 stderr(>&2)에 오류를 에코하고, 실제 실패 시 0이 아닌 값으로 종료하고, cron의 메일이나 저널에서 오전 3시에 실제로 필요한 한 줄을 보여줍니다.
- 조기 에스컬레이션: JSON 구문 분석, 3개 이상의 중첩 수준, HTTP 호출 또는 모든 상태 저장 논리는 Python 또는 awk에 속합니다. 범용 언어로 변형된 bash는 명성을 얻은 곳입니다.
현장 노트
중괄호 확장 흉터: rm -rf "${CLEANUP}"/{a,b} with CLEANUP unset은 의도가 아닌 쉘이 원하는 방식으로 정확히 확장되었습니다. 이와 같은 모든 경로에는 이제 ${VAR:?} 가드가 포함되어 있으며 해당 비용을 두 번 지불한 사람은 없습니다.
자주 묻는 질문
#!/bin/bash 또는 #!/usr/bin/env bash?
env는 bash가 다른 곳에 있는 컨테이너 및 macOS 설치 전반에서 승리합니다. shebang은 set -euo Pipefail이 실제로 존재하고 모든 변경 사항을 Shellcheck가 전달하는 것보다 중요하지 않습니다.
내 스크립트는 수동으로 작동하지만 cron에서는 실패합니다. 왜?
Cron은 기본 환경에서 실행됩니다. PATH는 짧고 로그인 프로필이 없으며 상대 경로가 잘못된 홈을 가리킵니다. 절대 경로를 사용하고, PATH를 명시적으로 설정하고, 디버깅을 위해 bash -x replay를 유지하세요.
서버 작업을 위한 Bash 또는 Python?
기존 시스템 도구를 주로 조정하고 소규모로 유지하는 파이프라인을 위한 Bash 호출 시에도 살아남아야 하는 구조화된 데이터, API 및 오류 처리를 위한 Python입니다. bash가 Python을 실행하도록 강제하는 것은 사건의 이름을 얻는 방법입니다.
삭제 스크립트를 안전하게 작성하려면 어떻게 해야 합니까?
모든 변수를 인용하고, mktemp에서 생성되거나 명시적으로 구성된 경로만 대상으로 삼고, 제거할 내용을 인쇄하는 테스트 실행 모드로 실행하고, ${VAR:?} 가드가 변수를 보기 전에 설정 해제를 거부하도록 합니다.
linux 명령 및 셸 기술에 대한 Kinetikatech의 지원
간단한 제안입니다: 관리자가 서버를 운영할지 아니면 싸울지 결정하는 명령 및 스크립팅 습관: 모든 기본 설치에 포함된 도구를 사용하여 텍스트와 프로세스를 검색, 변환, 전송 및 감독합니다. 당사의 Linux 서버 보안 및 서버 관리 서비스를 맡겨 주십시오. 철저하게 평가되고, 깨끗하게 구현되며, 24시간 모니터링됩니다.