Могу ли я изменить файл сценария bash (.sh) во время его работы?

Предположим, у меня есть скрипт script.sh, выполнение которого занимает некоторое время. Я исполняю это, ./script.sh. Пока он работает в окне терминала, я изменяю файл script.sh. Повлияет ли это на уже запущенный процесс?

После его изменения я запускаю измененный файл, поэтому у меня сейчас два запущенных процесса. Это нормально?

27
задан 16 June 2014 в 19:27

4 ответа

При внесении изменений в сценарий Вы вносите изменения на диске (жесткий диск - постоянное хранение); при выполнении сценария сценарий загружается в память (RAM).

Так, изменения, которые Вы вносите в сценарий, не будут влиять на под управлением сценарий, он выполнит версию, которую Вы выполнили прежде, чем внести те изменения.

Однако при выполнении измененного сценария снова, не завершая ранее рабочий экземпляр будет два экземпляра сценария - тот, который имеет изменения и старое.

быть предупрежденным, что ресурсы, которые сценарий использует и изменяет, будут конфликтовать. Например, при изменении файла с помощью сценария сценарий, который работает позже, не будет в состоянии открыть тот файл для записи и не удаться выполниться правильно.

Обновление: Благодаря Зарегистрированному пользователю для указания на меня к лучшему ответу на Unix.stackexchange.com.

В зависимости от размера сценария и рассматриваемого компилятора/интерпретатора, сценарий загружается частично/полностью. Так, если сценарий не будет полностью загружен, то изменения, которые Вы вносите в свой сценарий, будут размышлять над рабочим экземпляром, как только часть сценария загружается в память.

Так, не рекомендуется изменить Ваш сценарий на диске, который в настоящее время работает за непредсказуемым выводом: Сначала остановите рабочий экземпляр и затем измените Ваш сценарий и затем повторно выполните сценарий.

36
ответ дан 16 June 2014 в 19:27

Я добавлю что-то, что я думаю, не был сказан в других ответах. Много зависит всего от , как Вы редактируете файл. Выполнение echo "stuff" >file от оболочки (другой экземпляр) действительно перезапишет файл, я думаю. Но если Вы отредактируете файл с, например emacs и затем сохраните, этого не произойдет. Вместо этого здесь редактор переименовывает старый файл к некоторому резервному имени (возможно, на самом деле удаляющий предыдущее резервное копирование), и затем запишите его измененное содержимое буфера как новый файл с (теперь освобожденный) старое название . Начиная с оболочки (или другой интерпретатор) чтение сценария почти наверняка откроет файл только однажды, это после этого независимо от местонахождения имени файла , это только продолжает читать файл физического диска (определенный inode числом), который был связан с именем файла во время открытия. Таким образом, даже если бы это читает сценарий в блоках (который был бы самым легким решением, если бы использование буферизовало текстовый ввод-вывод), это продолжило бы читать строки из старого экземпляра файла, который, вероятно, не изменится Вашим редактированием.

4
ответ дан 16 June 2014 в 19:27

ответ @jobin вообще корректен, но я добавлю некоторые другие ответы, которые могут быть к точке, зависящей, что Вы хотите сделать.

, Если Вы хотите изменить сценарий и хотеть знать, что это безопасно, тогда Вы хотите записать в новый файл, не существующий, новый файл может быть расположен, где старый был все же. Запишите свою новую версию в новый файл, и затем используйте mv для перемещения ее в место поверх старого. Файл, который был заменен все еще, существует, он просто не связан из каталога. Ваш под управлением сценарий может продолжить использовать его, и когда тот сценарий закрывает свой дескриптор файла, система знает, что это может безопасно очистить файл (или сразу или в более позднее время).

, Если Вы хотите вести себя поведение сценария на лету, у Вас есть более трудная проблема. Я ожидаю, что необходимо было бы встроить его в код сценария. Сценарии Bash могут обработать сигналы (например, может поймать что-то как kill -USR1 [pid]), и сценарий мог тогда ответить путем перезагрузки некоторого кода. Таким образом, возможно, можно получить функциональность близко к тому, что Вы хотите, но не зная, что Вы после, я не вижу серьезных оснований, чтобы сделать это, и я подозреваю, хотите ли Вы сделать что-то этот комплекс, Вы, вероятно, хотите, чтобы более сложный язык программирования выполнил в нем.

, Если Вы хотите взломать поведение под управлением сценария, который не записан с этим в памяти, тогда Вы являетесь неудачливыми. Я смущался бы называть любую задачу программирования невозможной, но если бы у Вас были ресурсы и навыки для этого вида задачи, Вы, по-видимому, не спросили бы здесь.

0
ответ дан 16 June 2014 в 19:27

это должно быть обновлено, выше ответов теперь, только частично исправьте:

с текущей версией удара, изменяя сценарий, дисковый, в то время как это работает, заставит удар "пытаться" загрузить изменения в память и взять на себя их в под управлением сценарии. если Ваши изменения произойдут то после в настоящее время строки выполнения новые строки будут загружены и выполнены. но, это - предположение ударом, и он может разобраться в нем или неправильно.

лучший способ сделать это - следующая последовательность действий: 1) загрузитесь, сценарий в память 2) удаляют сценарий из диска 3), пишут новый сценарий в диск путем удаления дисковой версии сначала, версия памяти теряет свои ссылки на него так, чтобы при предоставлении новой версии на шаге 3 никакая попытка удара не была предпринята для загрузки нового содержания в версию памяти.

0
ответ дан 16 June 2014 в 19:27

Другие вопросы по тегам:

Похожие вопросы: