다음 크론 작업이 있습니다 /etc/cron.d/backup
.
*/1 * * * * backupbot /home/backupbot/bin/backup-script.sh
기본적으로 매분마다 실행되기를 원합니다 backup-script.sh
(그리고 사용자는백업 로봇작업을 실행해야 합니다.)
이 /home/backupbot/bin/backup-script.sh
파일의 소유자는백업 로봇(그리고 그는 "x" 권한을 가지고 있습니다). 파일은 다음과 같습니다.
#!/bin/bash
set -e
{
BACKUP_DIR=/var/app/backups
STORAGE_ACCOUNT_URL=https://myserver/backups
BACKUP_FILE=$(ls $BACKUP_DIR -t | head -1)
if [ -z "$BACKUP_FILE" ]; then
echo "There are no backups to synchronize"
exit 0
fi
azcopy login --identity
azcopy copy $BACKUP_DIR/$BACKUP_FILE $STORAGE_ACCOUNT_URL/$BACKUP_FILE
} >/tmp/cron.backup-script.$$ 2>&1
일반적으로 모든 출력은 에 기록되어야 합니다 /tmp/cron.backup-script.xxxx
. 이러한 파일은 생성되지 않습니다.
Cron이 작업을 인지했다는 유일한 증거는 다음 출력입니다 systemctl status cron.service
.
● cron.service - Regular background program processing daemon
Loaded: loaded (/lib/systemd/system/cron.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2021-04-13 09:59:08 UTC; 6h ago
Docs: man:cron(8)
Main PID: 1086 (cron)
Tasks: 1 (limit: 4915)
CGroup: /system.slice/cron.service
└─1086 /usr/sbin/cron -f
Apr 13 16:00:01 my-vm CRON[17201]: pam_unix(cron:session): session closed for user root
Apr 13 16:00:01 my-vm CRON[17198]: pam_unix(cron:session): session closed for user root
Apr 13 16:00:01 my-vm CRON[17199]: pam_unix(cron:session): session closed for user root
Apr 13 16:01:01 my-vm CRON[17402]: pam_unix(cron:session): session opened for user root by (uid=0)
Apr 13 16:01:01 my-vm CRON[17403]: (root) CMD ([ -f /etc/krb5.keytab ] && [ \( ! -f /etc/opt/omi/creds/omi.keytab \) -o \( /etc/krb5.keytab -nt /etc/opt/omi/creds/omi.keytab \) ] &&
Apr 13 16:01:01 my-vm CRON[17401]: pam_unix(cron:session): session opened for user backupbot by (uid=0)
Apr 13 16:01:01 my-vm CRON[17404]: (backupbot) CMD (/home/backupbot/bin/backup-script.sh)
Apr 13 16:01:01 my-vm CRON[17402]: pam_unix(cron:session): session closed for user root
Apr 13 16:01:01 my-vm CRON[17401]: (CRON) info (No MTA installed, discarding output)
Apr 13 16:01:01 my-vm CRON[17401]: pam_unix(cron:session): session closed for user backupbot
세션에 대해 언급합니다.백업 로봇. 어떻게 더 자세히 조사할 수 있나요?
답변1
댓글에 따르면, 스크립트는 다음과 같습니다오직소유자가 실행 가능합니다. 즉, 읽을 수 없습니다. 이렇게 하면 소유자가 스크립트를 실행할 수 없습니다.
예:
$ chmod 500 script
$ ls -l script
-r-x------ 1 myself myself 24 Apr 14 09:21 script
$ ./script
hello
$ chmod 100 script
$ ls -l script
---x------ 1 myself myself 24 Apr 14 09:21 script
$ ./script
/bin/bash: ./script: Permission denied
스크립트 파일을 읽을 수 없으면 bash
쉘 해석기(현재 사용자로 실행 중)가 이를 읽을 수 없습니다.
스크립트를 실행 가능하고 읽을 수 있게 만듭니다.
위의 것 외에도 다음을 사용하는 것도 고려할 수 있습니다.변수 확장에 대한 올바른 큰따옴표, 그리고다음의 출력을 구문 분석하지 않습니다.ls
(정말 유용한 유일한 것은보고 있다).
스크립트가 수정되었습니다:
#!/bin/bash
backup_dir=/var/app/backups
storage_account_url=https://myserver/backups
{
# Find most recently modified file in "$backup_dir".
# Assumes that there are only files there, no subdirectories.
set -- "$backup_dir"/*
backup_file_path=$1
shift
for pathname do
if [ "$pathname" -nt "$backup_file_path" ]; then
backup_file_path=$pathname
fi
done
if [ ! -e "$backup_file_path" ]; then
echo 'There are no backups to synchronize'
exit 1
fi
# Perform backup.
azcopy login --identity || exit 1
azcopy copy "$backup_file_path" "$storage_account_url/$(basename "$backup_file_path")"
} >/tmp/cron.backup-script.$$ 2>&1
답변2
cron
작업은 , 또는 을 통해 at
실행되거나 batch
데스크탑의 동일한 런타임 환경에서 실행되지 않습니다. 변경 사항이나 기타 환경 변수 설정은 작업 PATH
에 자동으로 전파되지 않습니다 cron
. 예를 들어 no $DISPLAY
이므로 GUI 프로그램에는 특별한 처리(읽기 man xhost
)가 필요합니다.
cron
환경 변수는 모든 작업에 대한 읽기 파일에서 설정할 수 있습니다 .crontab
man 5 crontab
echo "=== set ===";set;echo "=== env ===";env | sort;echo "=== alias ===";alias
각 환경의 결과를 확인하세요.
해당 줄은 기본적으로 해석되기 때문에 command
구문이 그보다 간단하므로 환경을 설정한 후 필요한 프로그램을 호출하는 스크립트(실행 가능, 설치, 시작)를 호출하는 것이 좋습니다.crontab
/bin/sh
/bin/bash
command
bash
#!/bin/bash
, 를 통해 실행되는 스크립트에서는 항상 절대 경로(루트 디렉터리에서 /
시작하는 경로 )를 사용합니다.cron
at
batch