Как я могу предотвратить одновременное выполнение двух сценариев оболочки?

У меня есть сценарий резервного копирования tar, который запускается один раз в месяц. Он работает ночью через cron. У меня также есть график мощности, который перезагружает сервер на 4.15 каждую ночь.

Проблема в том, что сервер перезагружается, пока запущен скрипт tar.

Могу ли я добавить что-то к началу и концу сценария bash, чтобы отключить перезагрузку, в то время как сценарий активен?

2
задан 29 May 2012 в 17:10

13 ответов

Обсуждается вопрос о том, как реализовать блокировку мьютекса в часто задаваемых вопросах Bash:

http://mywiki.wooledge.org/BashFAQ/045

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

Tar script:

#!/bin/bash

lockdir=/tmp/myscript.lock

if mkdir "$lockdir"
then    # directory did not exist, but was created successfully
    echo >&2 "successfully acquired lock: $lockdir"
    trap 'rm -rf "$lockdir"' 0    # remove directory when script finishes
    # continue script
else
    echo >&2 "cannot acquire lock, giving up on $lockdir"
    exit 0
fi

# DO YOUR ORIGINAL TAR SCRIPT HERE

Сценарий перезагрузки:

#!/bin/bash

lockdir=/tmp/myscript.lock

while true; do
    if mkdir "$lockdir"
    then    # directory did not exist, but was created successfully
        trap 'rm -rf "$lockdir"' 0    # remove directory when script finishes
        break    # continue with script
    else
        sleep 5  # sleep for 5 seconds and try again
    fi
done

# RUN YOUR REBOOT COMMANDS HERE
3
ответ дан 25 July 2018 в 18:44

Я бы использовал метод опроса для pid этого скрипта. Основная идея - ждать, пока скрипт не выпустит PID (это означает, что он вышел), и только затем перейдите к следующему шагу сценария перезагрузки. И, конечно, если процесс не запущен, скрипт будет перезагружен.

#!/bin/bash
while pgrep -f my_backup_script_name.sh > /dev/null
do 
  sleep 0.25  # small delay so that the loop doesn't hog the CPU
done
shutdown -r now
0
ответ дан 25 July 2018 в 18:44

Обсуждается вопрос о том, как реализовать блокировку мьютекса в часто задаваемых вопросах Bash:

http://mywiki.wooledge.org/BashFAQ/045

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

Tar script:

#!/bin/bash

lockdir=/tmp/myscript.lock

if mkdir "$lockdir"
then    # directory did not exist, but was created successfully
    echo >&2 "successfully acquired lock: $lockdir"
    trap 'rm -rf "$lockdir"' 0    # remove directory when script finishes
    # continue script
else
    echo >&2 "cannot acquire lock, giving up on $lockdir"
    exit 0
fi

# DO YOUR ORIGINAL TAR SCRIPT HERE

Сценарий перезагрузки:

#!/bin/bash

lockdir=/tmp/myscript.lock

while true; do
    if mkdir "$lockdir"
    then    # directory did not exist, but was created successfully
        trap 'rm -rf "$lockdir"' 0    # remove directory when script finishes
        break    # continue with script
    else
        sleep 5  # sleep for 5 seconds and try again
    fi
done

# RUN YOUR REBOOT COMMANDS HERE
3
ответ дан 2 August 2018 в 00:52

Я бы использовал метод опроса для pid этого скрипта. Основная идея - ждать, пока скрипт не выпустит PID (это означает, что он вышел), и только затем перейдите к следующему шагу сценария перезагрузки. И, конечно, если процесс не запущен, скрипт будет перезагружен.

#!/bin/bash
while pgrep -f my_backup_script_name.sh > /dev/null
do 
  sleep 0.25  # small delay so that the loop doesn't hog the CPU
done
shutdown -r now
0
ответ дан 2 August 2018 в 00:52

Обсуждается вопрос о том, как реализовать блокировку мьютекса в часто задаваемых вопросах Bash:

http://mywiki.wooledge.org/BashFAQ/045

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

Tar script:

#!/bin/bash

lockdir=/tmp/myscript.lock

if mkdir "$lockdir"
then    # directory did not exist, but was created successfully
    echo >&2 "successfully acquired lock: $lockdir"
    trap 'rm -rf "$lockdir"' 0    # remove directory when script finishes
    # continue script
else
    echo >&2 "cannot acquire lock, giving up on $lockdir"
    exit 0
fi

# DO YOUR ORIGINAL TAR SCRIPT HERE

Сценарий перезагрузки:

#!/bin/bash

lockdir=/tmp/myscript.lock

while true; do
    if mkdir "$lockdir"
    then    # directory did not exist, but was created successfully
        trap 'rm -rf "$lockdir"' 0    # remove directory when script finishes
        break    # continue with script
    else
        sleep 5  # sleep for 5 seconds and try again
    fi
done

# RUN YOUR REBOOT COMMANDS HERE
3
ответ дан 4 August 2018 в 16:23

Я бы использовал метод опроса для pid этого скрипта. Основная идея - ждать, пока скрипт не выпустит PID (это означает, что он вышел), и только затем перейдите к следующему шагу сценария перезагрузки. И, конечно, если процесс не запущен, скрипт будет перезагружен.

#!/bin/bash
while pgrep -f my_backup_script_name.sh > /dev/null
do 
  sleep 0.25  # small delay so that the loop doesn't hog the CPU
done
shutdown -r now
0
ответ дан 4 August 2018 в 16:23

Обсуждается вопрос о том, как реализовать блокировку мьютекса в часто задаваемых вопросах Bash:

http://mywiki.wooledge.org/BashFAQ/045

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

Tar script:

#!/bin/bash

lockdir=/tmp/myscript.lock

if mkdir "$lockdir"
then    # directory did not exist, but was created successfully
    echo >&2 "successfully acquired lock: $lockdir"
    trap 'rm -rf "$lockdir"' 0    # remove directory when script finishes
    # continue script
else
    echo >&2 "cannot acquire lock, giving up on $lockdir"
    exit 0
fi

# DO YOUR ORIGINAL TAR SCRIPT HERE

Сценарий перезагрузки:

#!/bin/bash

lockdir=/tmp/myscript.lock

while true; do
    if mkdir "$lockdir"
    then    # directory did not exist, but was created successfully
        trap 'rm -rf "$lockdir"' 0    # remove directory when script finishes
        break    # continue with script
    else
        sleep 5  # sleep for 5 seconds and try again
    fi
done

# RUN YOUR REBOOT COMMANDS HERE
3
ответ дан 6 August 2018 в 01:02

Я бы использовал метод опроса для pid этого скрипта. Основная идея - ждать, пока скрипт не выпустит PID (это означает, что он вышел), и только затем перейдите к следующему шагу сценария перезагрузки. И, конечно, если процесс не запущен, скрипт будет перезагружен.

#!/bin/bash
while pgrep -f my_backup_script_name.sh > /dev/null
do 
  sleep 0.25  # small delay so that the loop doesn't hog the CPU
done
shutdown -r now
0
ответ дан 6 August 2018 в 01:02

Обсуждается вопрос о том, как реализовать блокировку мьютекса в часто задаваемых вопросах Bash:

http://mywiki.wooledge.org/BashFAQ/045

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

Tar script:

#!/bin/bash

lockdir=/tmp/myscript.lock

if mkdir "$lockdir"
then    # directory did not exist, but was created successfully
    echo >&2 "successfully acquired lock: $lockdir"
    trap 'rm -rf "$lockdir"' 0    # remove directory when script finishes
    # continue script
else
    echo >&2 "cannot acquire lock, giving up on $lockdir"
    exit 0
fi

# DO YOUR ORIGINAL TAR SCRIPT HERE

Сценарий перезагрузки:

#!/bin/bash

lockdir=/tmp/myscript.lock

while true; do
    if mkdir "$lockdir"
    then    # directory did not exist, but was created successfully
        trap 'rm -rf "$lockdir"' 0    # remove directory when script finishes
        break    # continue with script
    else
        sleep 5  # sleep for 5 seconds and try again
    fi
done

# RUN YOUR REBOOT COMMANDS HERE
3
ответ дан 7 August 2018 в 18:29

Я бы использовал метод опроса для pid этого скрипта. Основная идея - ждать, пока скрипт не выпустит PID (это означает, что он вышел), и только затем перейдите к следующему шагу сценария перезагрузки. И, конечно, если процесс не запущен, скрипт будет перезагружен.

#!/bin/bash
while pgrep -f my_backup_script_name.sh > /dev/null
do 
  sleep 0.25  # small delay so that the loop doesn't hog the CPU
done
shutdown -r now
0
ответ дан 7 August 2018 в 18:29

Обсуждается вопрос о том, как реализовать блокировку мьютекса в часто задаваемых вопросах Bash:

http://mywiki.wooledge.org/BashFAQ/045

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

Tar script:

#!/bin/bash

lockdir=/tmp/myscript.lock

if mkdir "$lockdir"
then    # directory did not exist, but was created successfully
    echo >&2 "successfully acquired lock: $lockdir"
    trap 'rm -rf "$lockdir"' 0    # remove directory when script finishes
    # continue script
else
    echo >&2 "cannot acquire lock, giving up on $lockdir"
    exit 0
fi

# DO YOUR ORIGINAL TAR SCRIPT HERE

Сценарий перезагрузки:

#!/bin/bash

lockdir=/tmp/myscript.lock

while true; do
    if mkdir "$lockdir"
    then    # directory did not exist, but was created successfully
        trap 'rm -rf "$lockdir"' 0    # remove directory when script finishes
        break    # continue with script
    else
        sleep 5  # sleep for 5 seconds and try again
    fi
done

# RUN YOUR REBOOT COMMANDS HERE
3
ответ дан 10 August 2018 в 07:10

Я бы использовал метод опроса для pid этого скрипта. Основная идея - ждать, пока скрипт не выпустит PID (это означает, что он вышел), и только затем перейдите к следующему шагу сценария перезагрузки. И, конечно, если процесс не запущен, скрипт будет перезагружен.

#!/bin/bash
while pgrep -f my_backup_script_name.sh > /dev/null
do 
  sleep 0.25  # small delay so that the loop doesn't hog the CPU
done
shutdown -r now
0
ответ дан 10 August 2018 в 07:10

Обсуждается вопрос о том, как реализовать блокировку мьютекса в часто задаваемых вопросах Bash:

http://mywiki.wooledge.org/BashFAQ/045

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

Tar script:

#!/bin/bash

lockdir=/tmp/myscript.lock

if mkdir "$lockdir"
then    # directory did not exist, but was created successfully
    echo >&2 "successfully acquired lock: $lockdir"
    trap 'rm -rf "$lockdir"' 0    # remove directory when script finishes
    # continue script
else
    echo >&2 "cannot acquire lock, giving up on $lockdir"
    exit 0
fi

# DO YOUR ORIGINAL TAR SCRIPT HERE

Сценарий перезагрузки:

#!/bin/bash

lockdir=/tmp/myscript.lock

while true; do
    if mkdir "$lockdir"
    then    # directory did not exist, but was created successfully
        trap 'rm -rf "$lockdir"' 0    # remove directory when script finishes
        break    # continue with script
    else
        sleep 5  # sleep for 5 seconds and try again
    fi
done

# RUN YOUR REBOOT COMMANDS HERE
3
ответ дан 15 August 2018 в 19:09

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

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