Задать вопрос
@javamain86

Как правильно подменить (скопировать) скрипта в самом скрипте?

Есть bash скрипт в init.d называется medteco.sh (он запускается при старте) в нем вызывается другой скрипт и в нем если вставлена sd карта с medteco.sh в корне то он делает cp с sd карты во внутренюю память в /etc/init.d/medteco.sh . При компировании через раз портится сам /etc/init.d/medteco.sh из-за чего аппарат не так загружается. Вопрос : Есть ли способ из самого скрипта подменить сам скрипт чтобы он не портился?
  • Вопрос задан
  • 89 просмотров
Подписаться 1 Простой 1 комментарий
Ответ пользователя 3vi1_0n3 К ответам на вопрос (3)
3vi1_0n3
@3vi1_0n3
Заменять скрипт в /etc/init.d из самого себя не очень правильная идея.
Да, заменить или модифицировать скрипт из самого себя можно, но, по идее, скрипты для запуска сервисов/демонов не должны модифицироваться напрямую, желательно только с новой версией пакета (если он есть).
Даже я бы так не стал делать, хотя я тот еще нетрадиционный баш-скриптер.

Если вам прям очень надо именно заменять сам скрипт по условию, то лучше это делать так:
1. Вызываем /etc/init.d/medteco.sh
2. Скрипт /etc/init.d/medteco.sh проверяет наличие скрипта на флэшке
3. Скрипт /etc/init.d/medteco.sh проверяет целостность скрипта на флэшке
4. Если скрипт существует и проверка целостности проходит, копируем на диск под другим именем, проверяем целостность еще раз. Контрольную сумму можно заранее посчитать тем же md5 и положить в файл рядом с новым скриптом.
5. Если шаг 4 успешен, удаляем/переименовываем старый скрипт (тот, который не /etc/init.d/medteco.sh, а старая версия скрипта с флэшки), переименовываем новый скрипт в старый.
6. Безусловно выполняем/source'им тот самый скрипт, передавая ему параметры при необходимости. В этом случае у вас будет вызвана либо старая рабочая версия, либо новая рабочая версия.

Скрипт /etc/init.d/medteco.sh затронут не будет (и не должен), он будет нужен для обработки ошибок и т.д., чтобы контролировать процесс независимо от его результата. Если прямо очень надо, чтобы старая версия не запускалась, бросаем ошибку и прерываем выполнение скрипта.

Альтернативный вариант: собираем пакет, который будет устанавливаться в систему, устанавливаем его прямо с флэшки. Пакетный менеджер прервет установку, если пакет поврежден и не должен заменить рабочую версию в теории.
Ответ написан
Комментировать