Подтвердить что ты не робот

Проверка наличия экрана указанного имени

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

4b9b3361

Ответ 1

Вы можете выполнить grep вывод screen -list для имени сеанса, который вы проверяете:

if ! screen -list | grep -q "myscreen"; then
    # run bash script
fi

Ответ 2

Вы можете запросить команду "выбрать" экрана для определенного сеанса; результат оболочки равен "0", если сеанс существует, и "1", если именованный сеанс сеанса не найден:

$ screen -S Tomcat
$ screen -S Tomcat -Q select . ; echo $?
0

против

$ screen -S Jetty -Q select . ; echo $?
No screen session found.
1

Обратите внимание, что '.' после select является необязательным, но может быть более надежным.

Ответ 3

Учитывая, что я не могу комментировать, я публикую это как новый ответ. Ответ troyfolger - хорошая идея, и в основном это попытка попробовать и отправить сеанс команде, которая будет делать очень мало. Одна из проблем заключается в том, что для некоторых (более старых) версий экран -Q не поддерживается, поэтому для этих версий правильная команда

screen -S Jetty -X select . ; echo $?

Которые отправляют команду "select". на экранную сессию под названием "Jetty".

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

Если вы читаете информационные документы, это говорит о том, что единственное использование select. с -X в качестве теста или для проверки того, что что-то выбрано.

Ответ 4

Все предлагаемые решения не касаются имен экранов, которые не имеют уникальных шаблонов, например. "ТЕСТ" и "ТЕСТ123". Когда вы screen -S "TEST" или screen -list "TEST", вы можете выбрать экран "TEST123"! Есть что-то неправильное (не детерминированное) в том, как экран GNU реализует сопоставление имени экрана.

Ниже приведена функция bash, которая пытается выполнить точное совпадение и возвращает PID.SCREEN NAME вместе с кодом выхода:

function find_screen {
    if screen -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -oh "[0-9]*\.$1" --color=NEVER -m 1 -q >/dev/null; then
        screen -ls "$1" | grep -o "^\s*[0-9]*\.$1[ "$'\t'"](" --color=NEVER -m 1 | grep -oh "[0-9]*\.$1" --color=NEVER -m 1 2>/dev/null
        return 0
    else
        echo "$1"
        return 1
    fi
}

Использование - выберите экран:

target_screen=$(find_screen "SCREEN NAME")
screen -S "$target_screen" ...etc...

Использование - проверьте, существует ли экран:

if find_screen "SCREEN NAME" >/dev/null; then
    echo "Found!"
fi

В любом случае, это будет охватывать 99,9% случаев. Чтобы быть уверенным в 99,99%, выделите специальные символы grep в имени экрана. Для идеального соответствия требуется, чтобы grep соответствовал всей строке до $, включая дату в круглых скобках, которая может развиваться с версиями. Другой метод идеального совпадения:

ls -A -1 /var/run/screen/S-${USER} | grep "^[0-9]*\.SCREEN NAME$"

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

Ответ 5

% 100 Работа.

screen -list | grep "SESSİON NAME" && echo "Active Program" || echo "Passive Program"