모든 백업 프로세스를 성공적으로 수행하고 진행 상황을 stderr 및 stdout에 기록하는 쉘 스크립트가 있습니다. 단, 한 가지 예외는 을 클릭할 때까지 마지막 줄이 터미널에 기록되지 않는다는 것입니다(스크립트를 수동으로 호출하는 경우) Enter.
이제 이것은 큰 문제가 아니지만 이것이 수행되지 않는다는 것이 정말 짜증나기 때문에 이것이 왜 수행되는지 이해하고 싶습니다.
(을 클릭한 후) 출력에 기록되는 내용은 Enter다음과 같습니다.
[blackero@XXXXXXXXXXXXXXXX ~]$ fullbackup.sh
Tue Feb 28 17:57:41 GMT 2012
Tue Feb 28 17:57:41 GMT 2012
Starting SITE_NAME backup
maintenance_mode was set to 1. [success]
/home/blackero/bin/fullbackup.sh: line 36: hash: lzma: not found
maintenance_mode was set to 0. [success]
Backup for SITE_NAME created
[blackero@XXXXXXXXXXXXXXXX ~]$
스크립트의 관련 부분은 다음과 같습니다( ↪
읽기 쉽도록 코드를 래핑했음을 의미).
#!/bin/bash
date
date 2>&1
# [A bunch of content has been deleted from here]
# Compress with lzma if available, otherwise use gzip
if hash lzma; then
lzma -c ${backup_dest}/${dbname} >${backup_dest}/${dbname}.lzma
↪ && rm ${backup_dest}/${dbname}
else
gzip -c ${backup_dest}/${dbname} >${backup_dest}/${dbname}.gz
↪ && rm ${backup_dest}/${dbname}
fi
# Disable maintenance mode.
drush -r ${drupal_root} vset --always-set maintenance_mode 0
# Remove old backups >30 days
find ${backup_dest} -mtime +30 -exec rm {} \; >> /dev/null 2>&1
echo "Backup for ${sitename} created"
echo
echo 2>&1
if hash lzma; then
따라서 해당 줄에 stderr이 표시되도록 하는 줄을 볼 수 있습니다 hash: lzma: not found
(이 메시지를 억제하여 해당 경고를 쓰지 않도록 할 수 있다면 좋을 것 같지만 그래도 견딜 수는 있습니다). 해당 행이 drush
표준 maintenance_mode was set to 0.
출력 에 기록되는 것을 볼 수 있습니다 . 하지만 Backup for SITE_NAME created
클릭해야만 선이 나타납니다 Enter.
이전 명령이 stdout을 로 리디렉션했기 때문입니까 /dev/null
? 어떻게든 해당 리디렉션을 실행 취소해야 합니까? (스트림 리디렉션은 개별 명령에만 자동으로 영향을 미치는 것 같습니다.)
(경고: 참고: 이 스크립트가 cron에서 실행되면 stdout 및 stderr이 로그 파일에 추가되도록 리디렉션되고 모든 것이 로그 파일에 기록되며 터미널 입력이 필요하지 않습니다. 이 스크립트는 원래 다음에서 나왔습니다.Drupal 관리 가이드:fullsitebackup_drush
;많이 편집했는데 코드가 거기에서 나온 것입니다 lzma
. gzip
)
답변1
백업 파일이 읽기 전용인 경우 rm
실행하는 명령은 find
백업 파일을 삭제해야 하는지 확인하라는 메시지를 표시할 수 있습니다. 프롬프트를 /dev/null로 리디렉션했기 때문에 프롬프트가 표시되지 않습니다. 누른 키가 Enter읽혀집니다 rm
( rm
파일을 삭제하지 않는다는 기본 응답이 적용됩니다).
이 가정이 맞다면 두 가지 방법 중 하나로 문제를 해결할 수 있습니다. 하나는 휴대 가능하지만 안전하지 않으며, 다른 하나는 휴대 가능하지만 더 안전합니다. 이 경우 보안 차이는 작을 수 있지만(공격자가 ${backup_dest}에 심볼릭 링크를 생성하지 못할 수 있으므로) 다음 두 가지 옵션을 권장합니다.
안전한:
find "${backup_dest}" -depth -mtime +30 -delete
가지고 다닐 수 있는:
find "${backup_dest}" -depth -mtime +30 \
'(' '(' -type d -exec rmdir {} \; -true ')' -o -exec rm -f {} \; ')'
마지막으로, 문자 장치를 검색할 수 없기 때문에 문자 장치에 추가하는 것과 문자 장치에 쓰는 것 사이에 차이가 없으므로 ""> /dev/null" 대신 ">> /dev/null"을 사용할 필요가 없습니다.