В Google Compute Engine у меня есть сценарий запуска, который использует gsutil
и gcloud
, которые являются частью оснастки google-cloud-sdk
, которая предустановлена на ubuntu-minimal-1804-lts
публичное изображение , которое является базовым изображением для изображения, которое я использую. Но когда я запускал сценарий запуска сегодня, он терпел неудачу 4 раза из 8, потому что snapd
решил выполнить автоматическое обновление одновременно с запуском сценария запуска
.
Как я могу дождаться завершения автообновления оснастки в сценарии запуска?
Вот команды, которые я выполнил, чтобы определить, что 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
В итоге я выполнил изменения снимков
, пока все не было Готово
, поместив это в начало моего сценария запуска:
# 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
Надеюсь, это поможет!
Я столкнулся с той же проблемой, и булавка указывала на причину, по которой можно было бы включить автоматическое обновление! В моем случае ожидание 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