Обычно я просто crontab -u user file
в чем-то вроде /etc/rc.local и загружаю вкладку cron. В остальном, делать особо нечего.
Обычно я делаю что-то вроде: (в rc.local)
wget http://169.254.169.254/latest/meta-data/instance-id -O /tmp/instance
INSTANCE=`cat /tmp/instance`
KEY="/etc/pk.pem"
CERT="/etc/cert.pem"
CONFIG=`ec2-describe-tags -K $KEY -C $CERT -F "resource-id=$INSTANCE" -F "key=ConfigBucket" | awk '{print $5}'`
if [ -n $CONFIG ]; then
s3cmd -c /etc/.s3cfg sync s3://$CONFIG/etc/ /etc
chmod +x /etc/post-ec2-start.sh
/etc/post-ec2-start.sh
fi
exit 0
Затем в /etc/post-ec2-start.sh
#!/bin/bash
wget http://169.254.169.254/latest/meta-data/instance-id -O /tmp/instance
INSTANCE=`cat /tmp/instance`
KEY="/etc/pk.pem"
CERT="/etc/cert.pem"
VOL1="vol-12345678"
VOL2="vol-87654321"
IP="54.123.123.132"
ec2-attach-volume -K $KEY -C $CERT $VOL1 -i "$INSTANCE" -d /dev/sdf
ec2-attach-volume -K $KEY -C $CERT $VOL2 -i "$INSTANCE" -d /dev/sdg
ec2-associate-address -K $KEY -C $CERT -i "$INSTANCE" $IP
sleep 90
mount /dev/sdf1 /home/
mount /dev/sdg1 /var/lib/mysql
hostname some.fqdn.com
#register crontabs
#crontab -u coteyr /etc/coteyr.crontab
crontab -u root /etc/root.crontab
#fix home directoris
cd /home/
for i in *; do
useradd $i
chown -R $i:$i /home/$i
done
Это имеет преимущество загрузки конфигурации из S3, а затем запуска на основе этой конфигурации. Если бы мне нужно было что-то запустить при (повторной) загрузке, я бы просто добавил это в /etc/post-ec2-start.sh или /etc/rc.local, в зависимости от того, нужно ли мне это в процессе настройки конфигурации или после завершения настройки. Что-то похожее должно сработать и для вас.
Используйте синтаксис арифметического выражения для выполнения математических операций:
count=10
(( nextcount = count + 1 ))
Как всегда, присваивание в оболочке не принимает пробелы (см.:Пробелы в присваиваниях переменных в сценариях оболочки):что-то вроде var=foo bar
запускает команду bar
с var
установлено на foo
. Или, в вашем случае, это команда +
, что вполне нормально, поскольку +
не имеет особого значения для оболочки (в любом случае ). Кроме того, var=1+1
принимает правую часть строки 1+1
, так как плюс — это обычный символ. Если бы оно имело особое значение (, например ;
или (
), вам нужно было бы указать его в кавычках.
Стандартным способом выполнения арифметических действий в оболочке является расширение $((... ))
, поэтому, чтобы добавить число и присвоить его переменной, используйте:
anothervar=$((var + 1))
Если вы используете Bash/ksh/zsh и просто хотите зациклить постоянное количество итераций, вы можете использовать:
for (( i = 0; i < 10 ; i++)); do something ; done
(for i in {1..10}
также будет работать, но в Bash раскрытие переменных не работает внутри раскрытия фигурных скобок.)
Можно сделать что-то похожее на то, что вы показали, используяdeclare -i
:
declare -i nextcount
nextcount=$count+1
Это объявляет переменную nextcount
с целочисленным атрибутом, что приводит к автоматическому арифметическому вычислению при каждом назначении. (Запустите help declare
в bash или посмотрите здесь для получения подробной информации. )Это не стандартная функция оболочки POSIX, но bash ее поддерживает.
Назначение не обязательно должно следовать непосредственно за командой declare
. Если это так, вы можете сделать это с помощью команды declare
,вот так:
declare -i nextcount=$count+1
Поддерживаются любые арифметические выражения с целыми числами и арифметическими операторами . Если операторы рискуют быть специально интерпретированы оболочкой по-другому, вы можете заключить выражение в кавычки, чтобы предотвратить это. Помните, что вы присваиваете текст переменной; над этим текстом выполняется арифметическая оценка. Для другого примера, после этой команды $x
расширится до13
:
declare -i x='2 * 7 - 1'
Даже если вы удалили пробелы, вы бы хотели, чтобы это было заключено в кавычки, потому что *
иначе интерпретировало бы его как glob , запуская расширение имени файла . Обратите внимание, что вокруг =
не должно быть пробелов.
Хотя обычно вы так не поступаете. Часто проще, элегантнее и читабельнее использовать арифметическое расширение(с$
)или арифметическую оценку(без $
), как предполагают другие ответы. Я представляю метод, показанный здесь, не для того, чтобы побудить вас предпочесть его, а главным образом потому, что он наиболее близок к тому, что показано в вашей книге, и фактически выполняет арифметику оболочки.
Арифметические выражения --, под которыми я подразумеваю выражения, которые оцениваются с использованием арифметики оболочки, поскольку они находятся внутри$((
))
или ((
))
--, позволяют использовать =
с пробелами вокруг него. =
в команде ((count = 10))
синтаксически не работает так же, как =
в команде count=10
.
Если x
имеет целочисленный атрибут (declare -i x
), вы даже можете написать что-то подобное, чтобы присвоить значение нескольким переменным, хотя я бы не советовал этого делать на том основании, что это сбивает с толку:
x=y=z=10
Если вам интересно, что это делает, вот подсказка --это делает то же самое:
x='y = z = 10'
Это присваивает строкеy = z = 10
(или, в первом примере,y=z=10
)значение x
. Важно, чтобы как минимум x
имел целочисленный атрибут. Предполагая, что это так,этот текст оценивается как арифметическое выражение. Подвыражение z = 10
присваивает 10
значение z
, но это подвыражение также имеет значение 10
, которое присваивается y
. Это полное выражение, которое является присваиванием y
, также имеет значение, по-прежнему 10
.
Обратите внимание, что первый =
выполняет обычное присваивание переменной оболочки, а остальные являются арифметическим оператором присваивания. Это не специально для второй формы (той, которая, находясь в кавычках, может содержать пробелы ). В x=y=z=10
первое =
также означает нечто отличное от двух других =
, хотя вы используете их для достижения той же цели. Это потенциально сбивает с толку. Я рекомендую не писать подобные вещи, за исключением, возможно, интерактивных целей для экспериментов. Вместо этого вы можете написать эту команду:
((x = y = z = 10))
Это простая арифметическая оценка. Все три знака =
являются арифметическим оператором присваивания. Все еще хорошо, если вы объявили некоторые или все переменные с целочисленным атрибутом --, за который я часто выступаю --, но вам не нужно этого делать.
Аналогичным образом в bash есть оператор +=
, который обычно добавляет текст:
$ x=foo
$ x+=bar
$ echo "$x"
foobar
(Начальные $
символы в некоторых строках — это моя подсказка. Я включаю их сюда, чтобы отличать входные данные, которые я даю bash, от выходных данных, которые он производит.)
Но атрибуты назначенной -переменной влияют на то, какую операцию +=
выполняет. +=
обычно используется для расширения индексированных массивов:
$ a=(foo bar baz)
$ a+=(quux)
$ echo "${a[@]}"
foo bar baz quux
Когда переменной с целочисленным атрибутом присваивается значение +=
, в -выполняется добавление места:
$ declare -i y=7
$ y+=2
$ echo "$y"
9
Но bash также имеет +=
в качестве арифметического оператора, который я предлагаю использовать вместо него в большинстве случаев. То есть, если y
содержит значение 2
,вместо этого вы можете написать это, чтобы увеличить значение y
на 2:
((y += 2))
Он также имеет другие традиционные составные операторы присваивания (, которые присутствуют в языке C ). Например, предположим, что я хочу уменьшить значение y
на 3. Это не работает:
$ y-=3
y-=3: command not found
Но это работает:
$ ((y -= 3))
$ echo "$y"
6
Или я мог бы просто сделать это, что одновременно изменяет y
и печатает новое значение:
$ echo "$((y -= 3))"
6