Azteka
Интересно, это только у меня?

У меня было подобное, когда я ещё на 3.0 и выше пытался ставить темы, оказавшиеся для форточек. Начиная с версии 3.0, когда в мозилле решили делать разный интерфейс под никсы (GTK) и форточки, темы оформления интерфейса перестали быть кроссплатформенными, и большинство из них теперь Windows-ONLY.
А на GTK они дают как минимум вот такие глюки с дублированием “стрелочек”.
Думаю, если вы вернётесь к стандартной теме firefox, все “стрелочки” нормализуются.
Что-то я не понял, зачем цикл?
У вас он крутится до тех пор, пока не найдёт первый незанятый экземпляром X номер.
В вашем случае достаточно было
if [ -f /tmp/.X1-lock ]
then chvt 8
else xinit `which /home/xbmc/start.sh` -- :1 &
fi
Только тут есть ещё одна проблема – существование lock-файла вовсе не гарантирует нормальную работу экземпляра программы, то есть X-сервера. При ненормальном завершении работы процесс файл может остаться и вообще при отсутствующем процессе.
P.S.
Проверил этот lock-файл – а он оказался неблокированный. То же мне lock… Правда, в нём вписан PID экземпляра X-сервера. Значит для надёжности придётся прочесть и проверить существование такого процесса.
P.P.S.
Примерно так:
F=/tmp/.X1-lock
[ -f $F ] && read P < $F
if [ -n "$P" -a -d "/proc/$P" ]
then chvt 8
else xinit `which /home/xbmc/start.sh` -- :1 &
fi
Xtty8=`ps aux|grep -cE '\stty8\s+\S+\s+\S+\s+\S+\s+/usr/bin/X\s'`
if ((Xtty8==0))
then xinit `which /home/xbmc/start.sh` -- :1 &
else chvt 8
fi
grep с ключом -E работает с регулярными выражениями, ключ -c выдаёт количество совпадений вместо найденных строк, в данном случае единицу.
\s+ означает любое количество пробельных символов, \S+ любое количество непробельных, соответственно в выводе ps aux идёт поиск tty8 и /usr/bin/X в одной строке через 4 столбца.

Впрочем, всё это можно сделать и несколькими другими способами :)
Я тоже не программист, а шелл изучал (и изучаю) по мере надобности ;)
Ну вот, примерно так:
#!/bin/bash
. /etc/rc.conf
. /etc/rc.d/functions
d_start() {
    /usr/sbin/ip tunnel add gif0 mode ipip local xxxxx remote xxxxx ttl 255 || return 1
    /sbin/ifconfig gif0 xxxxxx netmask xxxxxxx pointopoint xxxxxxxxx mtu 1500 || return 1
    /sbin/route add default gw xxxxxxxx || return 1
    return 0
}
case "$1" in
  start)
    stat_busy "Starting IP-IP Tunnel"
    if d_start ; then
      add_daemon iptunnel
      stat_done
    else
      stat_fail
    fi
    ;;
  stop)
    stat_busy "Stopping IP-IP Tunnel"
    /sbin/ifconfig gif0 destroy
    if [ $? -gt 0 ]; then
      stat_fail
    else
      rm_daemon iptunnel
      stat_done
    fi
    ;;
  restart)
    $0 stop
    sleep 1
    $0 start
    ;;
  *)
    echo "usage: $0 {start|stop|restart}"..
esac
exit 0
Так удалите драйверы других производителей.
Или можно поставить nouveau.
“Виноват КДЕ, xorg…”
А диск тут при чём?
Шаманство какое-то.
Свежо предание, но верится с трудом.
Что-то я не нахожу ни в баше, ни в /etc/rc.d/functions никакого error.
Я вижу из этой ситуации как минимум два выхода:
1) Поставить после каждой критической команды || errflag=1 , а перед каждой следующей условие выполнения вроде ((errflag==1)) ||
В конце, соответственно, по этому самому “errflag” выполнить stat_done или stat_fail
2) Выделить запуск и останов туннеля в отдельные функции. После каждой критической команды ставить || return 1 , в конце функции return 0 , а после её вызова && stat_done || stat_fail
Всё просто :)
Берём один из “демонских” скриптов из /etc/rc.d/ и по его образу и подобию ваяем аналогичный для туннеля.
После чего остаётся добавить нового демона в список для запуска, в нужную вам позицию.
А что же говорит fsck ?
Даже как-то сразу сложно сосчитать :)
Около 9 из AUR, где-то 12 собственных самопальных, из них две штуки подумав, залил-таки в AUR.
Некоторые трудно отнести к определённой категории – те что я взял их из AUR, а потом немного подправил от себя.