скрипт bash для запуска не более одного раза

Сsed:

sed '/^test_1/s/,[^,]*//2' file
  • /^test_1/поиск строк, начинающихся с test_1, затем
  • s/,[^,]*//2заменить второе вхождение запятой, за которой следуют любые символы, не являющиеся запятыми -, пустой строкой
3
22.09.2021, 16:22
2 ответа
You can add below commands to kill the battery script while logging in

ps -eaf | awk 'BEGIN{IGNORECASE=1}/battery/ && !/awk/{print "kill -9 "$2}'| sh
-2
22.09.2021, 19:09

Вы можете добавить в скрипт механизм файла блокировки. Просто убедитесь, что файл блокировки надежно удален при выходе из скрипта, например. установив ловушку:

#!/bin/bash

lockfile="/var/run/lock/batterystatus.lock"

if [[ -e "$lockfile" ]]; then exit 0; fi

trap 'rm -f "$lockfile"' EXIT
touch "$lockfile"

#... your actual script code here

Обратите внимание, что в случае завершения скрипта с помощью SIGKILL, trapбудет недостаточно для надежного удаления файла блокировки.


После полезного разъяснения Камиля Мациоровски, вот улучшенная версия с использованием flock.

#!/bin/bash

lockfile="/var/run/lock/batterystatus.lock"
exec 100>"$lockfile"
if ! flock -n 100; then exit 0; fi

#... your actual script here

Это создаст файл блокировки, если необходимо, и перенаправит дескриптор файла 100(, выбранный почти произвольно)(1 ), в файл блокировки. Затем он пытается заблокировать этот файловый дескриптор через flock.Если это удастся, блокировка будет удерживаться до выхода скрипта. Если, с другой стороны, другой экземпляр сценария уже заблокировал этот файловый дескриптор, сценарий немедленно завершится.

Обратите внимание, что нет необходимости очищать файл блокировки -блокировка, выполняемая flock, имеет значение здесь. Это также означает, что существование файла блокировки не означает, что скрипт не должен запускаться -, а только наличие блокировки на этом файле.

Идея взята из здесь . Для дальнейшего чтения взгляните на


(1)Если у вас Bash > 4.1, вы можете сделать так, чтобы оболочка автоматически -выделяла свободный файловый дескриптор с помощью синтаксиса {variable-name}>redirection-target-, как в:

exec {lockfd}>"$lockfile"
if ! flock -n "$lockfd"; then exit 0; fi

Оболочка найдет следующий свободный файловый дескриптор (с тем ограничением, что используются только номера дескрипторов > 9 ), и сохранит фактически используемый дескриптор в переменной $lockfdдля дальнейшего использования.

3
23.09.2021, 08:36

Теги

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