Я запускаю сценарий резервного копирования базы данных через cron и хотел бы отправить вывод программы в системный журнал (чтобы он отправлялся на Stackdriver Logging ).
Я пытался запустить следующее:
/opt/orientdb/bin/backup.sh \
remote:localhost/[database name] \
root root \
/db-backup/orientdb-dev/$(date +"%Y-%m-%d_%H-%M-%S").zip \
lvm \
2>&1 \
| tr '\n' ' ' \
| /usr/bin/systemd-cat -t "orientdb-backup"
Однако этот скрипт выводит в syslog при прямом вызове, но не включает никаких выводов при запуске через cron.
Syslog после запуска вручную (несвязанные строки удалены):
[user]@orientdb-dev:~$ sudo /opt/orientdb/bin/backup.sh remote:localhost/[database name] root root /db-backup/orientdb-dev/$(date +"%Y-%m-%d_%H-%M-%S").zip lvm 2>&1 | tr '\n' ' ' | /usr/bin/systemd-cat -t "orientdb-backup"
[user]@orientdb-dev:~$ tail /var/log/syslog
Jan 21 18:16:48 orientdb-dev orientdb-backup[3522]: /opt/orientdb /opt/orientdb/bin/backup.sh: 103: cd: can't cd to /opt/orientdb/databases/[database name] Volume group "sda1" not found Cannot process volume group sda1 2018-01-21 18:16:47:716 WARNING No enough physical memory available for DISKCACHE: 581MB (heap=494MB). Set lower Maximum Heap (-Xmx setting on JVM) and restart OrientDB. Now running with DISKCACHE=256MB [orientechnologies] Error: com.orientechnologies.orient.core.exception.OStorageException: Cannot create a connection to remote server address(es): [127.0.0.1:2424] ERROR # 1 : database freeze failed
Файл Cron:
$ cat /etc/cron.d/orientdb-backup
#Ansible: backup
*/5 * * * * root /opt/orientdb/bin/backup.sh remote:localhost/[database name] root root /db-backup/orientdb-dev/$(date +"%Y-%m-%d_%H-%M-%S").zip lvm 2>&1 | tr '\n' ' ' | /usr/bin/systemd-cat -t "orientdb-backup"
Системный журнал после запуска задания cron:
Jan 21 18:15:01 orientdb-dev CRON[3438]: (root) CMD (/opt/orientdb/bin/backup.sh remote:localhost/[database name] root root /db-backup/orientdb-dev/$(date +")
Jan 21 18:15:01 orientdb-dev CRON[3437]: (CRON) info (No MTA installed, discarding output)
Похоже, что есть » Есть нечто иное между запуском команды в оболочке и внутри задания cron, но я ничего не могу найти.
Проблема решена: формат даты ( $ (date + "% Y-% m-% d_% H-% M-% S")
) использует %
символ, зарезервированный cron.
Замена %
на \%
устранила проблему.