Я создал файл bash, который запускает другой файл bash на отдельном экране с уникальным именем, мне нужно убедиться, что только один экземпляр этого внутреннего файла bash работает в любой момент времени, Чтобы сделать это, я хочу, чтобы проверка родительского файла bash проверяла, существует ли экран с таким именем, прежде чем пытаться его создать. Есть ли способ сделать это?
Проверка наличия экрана указанного имени
Ответ 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"