@javamain86

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

Есть bash скрипт в init.d называется medteco.sh (он запускается при старте) в нем вызывается другой скрипт и в нем если вставлена sd карта с medteco.sh в корне то он делает cp с sd карты во внутренюю память в /etc/init.d/medteco.sh . При компировании через раз портится сам /etc/init.d/medteco.sh из-за чего аппарат не так загружается. Вопрос : Есть ли способ из самого скрипта подменить сам скрипт чтобы он не портился?
  • Вопрос задан
  • 54 просмотра
Пригласить эксперта
Ответы на вопрос 3
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Есть ли способ из самого скрипта подменить сам скрипт чтобы он не портился?

Когда cp или mv заменяет открытый интерпретатором файл, исходный файл не портится. Если интерпретатор взаимодействует с файлом через один и тот же файловый дескриптор, то никакого значения замена файла не имеет. Нужно разбираться с деталями того что портится, чтобы понять, как это пофиксить.
Ответ написан
Комментировать
saboteur_kiev
@saboteur_kiev Куратор тега bash
software engineer
Что значит "портится" - непонятно. Надо выяснить что происходит. Флешку кто-то вынимает, не размонтировав, или копирование фейлится
Простой способ - копируй скрипт в medteco.sh.tmp и после того как скопировалось успешно, переименовывай.
Можно добавить какую-нить верификацию чексуммы, для бОльшей надежности.
Но сперва понять причину "порчения".
Ответ написан
Комментировать
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 затронут не будет (и не должен), он будет нужен для обработки ошибок и т.д., чтобы контролировать процесс независимо от его результата. Если прямо очень надо, чтобы старая версия не запускалась, бросаем ошибку и прерываем выполнение скрипта.

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы