次のクローン操作があります/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