В Google Compute Engine у меня есть сценарий запуска, который использует gsutil
и gcloud
, которые являются частью google-cloud-sdk
оснастка, которая предустановлена на ubuntu-minimal-1804-lts
общественный имидж, который является базовым изображением для изображения, которое я использую. Но когда я запускал сценарий запуска сегодня, он терпел неудачу 4 раза из 8, потому что snapd
решил выполнить автоматическое обновление одновременно с startup-script
запущен.
Как в сценарии запуска дождаться завершения автообновления привязки?
Вот команды, которые я выполнил, чтобы определить, что snapd
обновлялся одновременно с моим сценарием запуска:
$ snap changes --abs-time
ID Status Spawn Ready Summary
3 Done 2019-05-16T18:08:34Z 2019-05-16T18:08:49Z Auto-refresh snaps "core", "google-cloud-sdk"
$ snap tasks 3 --abs-time
Status Spawn Ready Summary
…
Done 2019-05-16T18:08:34Z 2019-05-16T18:08:45Z Ensure prerequisites for "google-cloud-sdk" are available
Done 2019-05-16T18:08:34Z 2019-05-16T18:08:46Z Download snap "google-cloud-sdk" (82) from channel "stable/ubuntu-18.04"
Done 2019-05-16T18:08:34Z 2019-05-16T18:08:47Z Fetch and check assertions for snap "google-cloud-sdk" (82)
Done 2019-05-16T18:08:34Z 2019-05-16T18:08:48Z Mount snap "google-cloud-sdk" (82)
Done 2019-05-16T18:08:34Z 2019-05-16T18:08:48Z Run pre-refresh hook of "google-cloud-sdk" snap if present
Done 2019-05-16T18:08:34Z 2019-05-16T18:08:48Z Stop snap "google-cloud-sdk" services
Done 2019-05-16T18:08:34Z 2019-05-16T18:08:48Z Remove aliases for snap "google-cloud-sdk"
Done 2019-05-16T18:08:34Z 2019-05-16T18:08:48Z Make current revision for snap "google-cloud-sdk" unavailable
Done 2019-05-16T18:08:34Z 2019-05-16T18:08:49Z Copy snap "google-cloud-sdk" data
Done 2019-05-16T18:08:34Z 2019-05-16T18:08:49Z Setup snap "google-cloud-sdk" (82) security profiles
Done 2019-05-16T18:08:34Z 2019-05-16T18:08:49Z Make snap "google-cloud-sdk" (82) available to the system
Done 2019-05-16T18:08:34Z 2019-05-16T18:08:49Z Automatically connect eligible plugs and slots of snap "google-cloud-sdk"
Done 2019-05-16T18:08:34Z 2019-05-16T18:08:49Z Set automatic aliases for snap "google-cloud-sdk"
Done 2019-05-16T18:08:34Z 2019-05-16T18:08:49Z Setup snap "google-cloud-sdk" aliases
Done 2019-05-16T18:08:34Z 2019-05-16T18:08:49Z Run post-refresh hook of "google-cloud-sdk" snap if present
Done 2019-05-16T18:08:34Z 2019-05-16T18:08:49Z Start snap "google-cloud-sdk" (82) services
Done 2019-05-16T18:08:34Z 2019-05-16T18:08:49Z Clean up "google-cloud-sdk" (82) install
Done 2019-05-16T18:08:34Z 2019-05-16T18:08:49Z Run configure hook of "google-cloud-sdk" snap if present
$ journalctl -u google-startup-scripts
…
May 16 18:08:39 my-instance startup-script[1469]: INFO startup-script-url: + gsutil cp gs://my-bucket/app.tar.gz /opt/my-bucket/app.tar.gz
May 16 18:08:41 my-instance startup-script[1469]: INFO startup-script-url: /snap/google-cloud-sdk/41/usr/bin/python2: relocation error: /lib/x86_64-linux-gnu/libnss_dns.so.2: symbol
__resolv_context_get, version GLIBC_PRIVATE not defined in file libc.so.6 with link time reference
В другом случае gsutil
не удалось с другим сообщением:
ERROR: (gsutil) /snap/google-cloud-sdk/41/usr/bin/python2: command not found
Я столкнулся с той же проблемой, и булавка также указала причину для автоматического обновления! В моем случае жду snap refresh
занимает слишком много времени, а количество рабочих мест по-прежнему доступно для одного человека, поэтому я просто уменьшено допустимое окно обновления к более спокойной части рабочей недели.
Например, попробуйте:
# Allows snap refreshes on Monday at 10AM and also on Friday at 3PM
sudo snap set system refresh.timer=mon,10:00,,fri,15:00
Я закончил бегать snap changes
пока все не было Done
поместив это в начало моего сценария запуска:
# Returns 0 if snapd is not updating google-cloud-sdk
# (nothing has happened, or all changes are Done, Hold, Error)
# Returns 1 if snapd is updating google-cloud-sdk
# (there is at least one chnage that is Doing, Abort, Undo, or Undoing)
# Echos the offending line
# https://serverfault.com/questions/967674/how-to-wait-for-snapd-auto-refresh-to-complete
function isSnapIdle {
# For the format of snap changes, see:
# see https://github.com/snapcore/snapd/blob/8ae45c207f3c488f0ab0dc3615661df9b0854b20/overlord/state/change.go
# and https://github.com/snapcore/snapd/blob/8ae45c207f3c488f0ab0dc3615661df9b0854b20/cmd/snap/cmd_changes.go#L124
local line
local changes
if changes=$(snap changes google-cloud-sdk); then
:
else
# When snap is upgrading itself, snap changes can fail
echo "snap changes gave error $? $changes"
return 2
fi
while read line; do
local state=$(echo "$line" | awk '{print $2}')
if [ "$state" = Do ] || [ "$state" = Doing ] || [ "$state" = Abort ] || [ "$state" = Undo ] || [ "$state" = Undoing ]; then
echo "$line"
return 1
fi
done < <(echo "$changes" | tail -n +2)
return 0
}
function waitUntilSnapIdle {
local lastSnapChange=
local snapChange
while ! snapChange=$(isSnapIdle); do
if [ "$snapChange" != "$lastSnapChange" ]; then
echo >&2 "Waiting for snapd to finish installing: $snapChange"
fi
lastSnapChange="$snapChange"
sleep 1
done
echo >&2 "Snapd does not appear to be installing google-cloud-sdk"
}
waitUntilSnapIdle
Я пытался воспроизвести вашу проблему, создав экземпляр с изображением ubuntu-minimal-1804-lts, как вы указываете
gcloud compute instances create \
--image-family ubuntu-minimal-1804-lts \
--image-project ubuntu-os-cloud \
--machine-type n1-standard-1 \
--boot-disk-size=15 \
--boot-disk-type=pd-ssd \
--zone=europe-west1-c \
--tags=allow-incoming-ssh \
--metadata=startup-script-url="gs://testinggrounds/startup.sh" \
ubuntu-test
а затем перезагрузите его несколько раз
for i in {1..7}; \
do \
gcloud compute instances reset ubuntu-test --zone europe-west1-c; \
sleep 120s; \
done
но мне не удалось решить эту проблему, о которой вы говорите.
Пытаясь найти ошибку, я обнаружил этот поток, в котором пользователь, сообщающий о проблеме, представляет очень похожую проблему, которая мощь будь таким же, как ты нашел. Как сообщила разработчик, проблема должна быть исправлена. Вы можете проверить, если дата для вашего образа Ubuntu 18.04 до даты открытия этой темы, которой я поделился? Может быть, используя новое изображение ваша проблема решена.
Я видел, что вы сказали, что это внезапно появилось не так давно, так что наверное не версия, но проверить не помешает.
Если бы это было не так, я бы предложил просто отложить выполнение сценария запуска или попробуйте заставить его работать после других служб snapd.
[Unit]
Description=Google Compute Engine Startup Scripts
After=local-fs.target network-online.target network.target rsyslog.service
After=google-instance-setup.service google-network-daemon.service
After=cloud-final.service multi-user.target
After=snapd.seeded.service
After=snapd.service
Wants=local-fs.target network-online.target network.target cloud-final.service
Wants=snapd.seeded.service
[Service]
ExecStartPre=/bin/sleep 20
ExecStart=/usr/bin/google_metadata_script_runner --script-type startup
KillMode=process
Type=oneshot
Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
[Install]
WantedBy=multi-user.target
Этот файл находится по адресу /lib/systemd/system/google-startup-scripts.service
. Я добавил After=snapd.service
и ExecStartPre=/bin/sleep 20
чтобы попытаться отложить выполнение услуги. Ваш файл должен выглядеть точно так же, как приведенный выше, без моих дополнений.
Если это по-прежнему не работает, вы можете попробовать добавить другие службы привязки с помощью After=
директиве, так как в папке служб systemd есть еще несколько:
$ ls /lib/systemd/system/ | grep snap
snapd.autoimport.service
snapd.core-fixup.service
snapd.failure.service
snapd.seeded.service
snapd.service
snapd.snap-repair.service
snapd.snap-repair.timer
snapd.socket
snapd.system-shutdown.service
Надеюсь, поможет!