Еженедельное задание крона для сохранения списка установленных пакетов

Один распространенный способ:

die() {
    IFS=' ' # make sure "$*" is joined with spaces

    # output the arguments if any on stderr:
    [ "$#" -eq 0 ] || printf '%s\n' "$*" 1>&2
    exit 1
}

затем Вы используете его как это:

mkdir -p some/path || die "mkdir failed with status $?"

Или если Вы хотите, чтобы это включало статус выхода, Вы могли бы изменить его на:

die() {
    last_exit_status=$?
    IFS=' '
    printf '%s\n' "FATAL ERROR: $* (status $last_exit_status)" 1>&2
    exit 1
}

и затем использование его немного легче:

mkdir -p some/path || die "mkdir failed"

Когда это перестало работать, mkdir вероятно, уже выпустит сообщение об ошибке, так, чтобы второй мог рассматриваться как избыточный, и Вы могли просто сделать:

mkdir -p some/path || exit   # with the same (failing) exit status as mkdir's
mkdir -p some/path || exit 1 # with exit status 1 always

(или используйте первый вариант die выше без аргумента)

На всякий случай Вы не видели command1 || command2 прежде, это работает command1, и если command1 сбои, это работает command2.

Таким образом, можно читать, это как "делает каталог или умирает".

Ваш пример был бы похож:

mkdir -p some/path || die "mkdir failed"
cd some/path || die "cd failed"
some_command || die "some_command failed"

Или можно выровняться dies далее справа так, чтобы основной код более очевиден.

mkdir -p some/path         || die "mkdir failed"
cd some/path               || die "cd failed"
some_command               || die "some_command failed"

Или на следующей строке, когда командные строки долги:

mkdir -p some/path ||
  die "mkdir failed"

cd some/path ||
  die "cd failed"

some_command ||
  die "some_command failed"

Кроме того, если Вы собираетесь использовать имя some/path многократно, сохраните его в переменной, таким образом, Вы не должны продолжать вводить его и можете легко изменить его, если Вы должны. И при передаче аргументов переменной командам, удостоверьтесь, что использовали -- разделитель опции так, чтобы аргумент не был взят в качестве опции, если это запускается с -.

dir=some/path
mkdir -p -- "$dir"         || die "Cannot make $dir"
cd -P -- "$dir"            || die "Cannot cd to $dir"
some_command               || die "Cannot run some_command"
2
09.05.2013, 23:54
3 ответа

Создайте файл со следующим содержанием (например. list_packages.sh):

#!/bin/bash

dpkg -l > ~/Dropbox/installed_packages

Поместите этот файл в /etc/cron.weekly/ и это будет работать один раз в неделю.

6
27.01.2020, 21:51
  • 1
    Просто любопытный: почему/bin/bash вместо/bin/sh? Я понимаю, что исходный плакат запускает Linux и будет, вероятно, иметь/bin/bash, но Ваш сценарий не зависит ни от каких определенных для удара функций. –  drench 21.08.2010, 18:27
  • 2
    @drench Никакая настоящая причина. Я просто ввел/bin/bash из привычки. Вы корректны в этом,/bin/sh работал бы просто великолепно. –  David Narayan 22.08.2010, 07:40

Сохраните это как сценарий, скажите installed_packages_list.sh:

#!/bin/bash
dpkg -l > ~/Dropbox/installed_packages

Сделайте это исполняемым файлом.

chmod u+x installed_packages_list.sh

Затем выполненный

crontab -e

Это откроет файл в текстовом редакторе. Введите это и сохраните

@weekly /full/path/to/script

Сценарий будет выполняться один раз в неделю с полномочиями пользователя, который запланировал задание крона.

2
27.01.2020, 21:51

Во-первых, для того, чтобы сделать это Вы не должны выполнять задание как суперпользователь.

Самый легкий способ решить это состоит в том, чтобы отредактировать crontab Вашего обычного пользователя через

crontab -e

В зависимости от Вас переменная среды РЕДАКТОРА пользователи crontab открыты с Вашим любимым текстовым редактором.

Там можно добавить что-то как

# m h dom mon dow command
5 12 * * 1 bash $HOME/pkg.backup.sh

Необходимо затем создать pkg.backup.sh файл с командой dpkg в нем.

Btw, если Вы хотите смочь легко восстановить свое текущее состояние пакета машины (иначе выбор пакета), затем эта командная строка, более ориентирован на цель:

dpkg --get-selections > foo

Для восстановления его просто необходимо ввести

dpkg --set-seclections < foo

На самом деле dpkg-l полезен в дополнение к этому, если Вы хотите зарегистрировать точное число версии пакета, также.

0
27.01.2020, 21:51

Теги

Похожие вопросы