Скрипт Bash не детерминирован в выполнении действий

Скрипт Bash не детерминирован в выполнении действий

У меня есть bash-скрипт, который я вызываю при загрузке системы (Ubuntu 10.04) «Автозагрузка приложений».

сценарий:

#!/bin/sh

APP1='/home/ipc-display/development/projects/display-mgmt'
LOG='/home/ipc-display/development/projects/bootLog.txt'

cd $APP1/target/scala-2.10
java -jar display-mgmt-1.0.jar &

# Auto Hide Mouse Pointer
/usr/bin/unclutter &

#Start chrome
sleep 5s
/usr/bin/google-chrome --incognito --app=http://192.168.0.100:9000/welcome &

#Bring Chrome to focus
sleep 5s
/usr/bin/wmctrl -a "http://" && 

#FullScreen Chrome
sleep 3s &&
/usr/bin/xdotool key F11

bash

Оставив в стороне мои УЖАСНЫЕ способности к написанию скриптов, есть ли у вас идеи, почему Chrome ВСЕГДА детерминированно не переходит в полноэкранный режим, как я ожидаю?

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

Спасибо.

решение1

Похоже, что это может быть вызвано проблемой синхронизации — возможно, что-то выводится на передний план в течение трех секунд между фокусировкой Chrome и нажатием F11.

Я не уверен, как это wmctrlработает, но кажется немного нелогичным, что вы используете &&в конце этой строки. Это не откладывает процесс в фоновом режиме, а скорее указывает оболочке выполнить следующую команду ( sleep 3s) только в случае успешного выполнения команды.

Однако вы можете просто использовать --kioskполноэкранный режим Chrome при запуске и пропустить остальную часть скрипта.

решение2

Ваш скрипт выглядит хорошо, но я не думаю, что вам нужно вставлять sleepв него так много вызовов. Люди обычно используют его, sleepчтобы обойти состояния гонки, вызванные невозможностью определить завершение какой-либо асинхронной задачи. Например, выполнение , wgetчтобы запустить удаленное выполнение скрипта и подождать достаточно времени, чтобы сервер сгенерировал файл, который они могут обработать GET, вы, вероятно, использовали бы его, sleepчтобы обойти незнание того, когда этот файл будет готов. Это немного неуклюже, но это работает для того, что нужно большинству людей.

Хотя ваши sleep' здесь на самом деле не имеют смысла. Например, я не думаю, что будет много вреда, если chromeзапустится до того, как unclutterуспеет сделать свое дело. Также нет асинхронной задачи, которую вы ждете завершения wmctl(ну, IPC задействован, но я не думаю, что wmctlон вернется, пока связь не завершится), поэтому вставка трех секунд sleepкажется излишней. Хотя я бы подумал, что любое количество sleepбудет излишним.

решение3

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

xdotool search --class Google-chrome -- key F11

Как заметил l0b0, вам, вероятно, следует использовать google-chrome --kiosk …вместо этого.

Связанный контент