LINUX.ORG.RU

Иногда не запускаются некоторые программы из скрипта

 


0

2

в автозапуске wm стоит скрипт .dwm/autostart.sh, который запускает нужные программы. Дело в том, что иногда не запускаются то терминал, то keepassx, иногда даже не запускается chrome. Как переделать так, чтобы запускалось всё ?

cat .dwm/autostart.sh | egrep -v "(^#.*|^$)"

sleep 0.1
imwheel &
sleep 0.1
kbdd &
sleep 0.1
$HOME/.dwm/scripts/startup/client/keepassx.sh;
sleep 0.1
$HOME/.dwm/scripts/startup/client/terminal.sh;
sleep 0.1
$HOME/.dwm/scripts/startup/client/chrome.sh
sleep 0.1
$HOME/.dwm/scripts/startup/client/rtorrent_client.sh &
sleep 0.1
if [[ -x "$(command -v icedove)" ]]; then
        sudo -u user sh -c 'icedove 2>/dev/null &'
fi
$HOME/.dwm/scripts/startup/client/skype.sh
sleep 0.1
$HOME/.dwm/scripts/startup/client/tkabber.sh
sleep 0.1
$HOME/.dwm/scripts/startup/daemon/thunar.sh
sleep 0.1
$HOME/.dwm/scripts/startup/daemon/utorrent.sh
sleep 0.1
$HOME/.dwm/scripts/startup/client/xchat.sh
exit 0

cat $HOME/.dwm/scripts/startup/client/keepassx.sh | egrep -v "(^#.*|^$)"

ABBR='keepassx'
PROGRAM='keepassx'
me=`basename $0`;
running=`ps h -C $me | grep -v $$ | wc -l`;
[[ $running > 1 ]] && exit;
ps -ef | grep opt | grep -n ${PROGRAM} | awk '{print $2}' | xargs kill -9
running=`ps h -C ${PROGRAM} | grep -v $$ | wc -l`;
[[ $running = 0 ]] &&  sudo -u user sh -c "${ABBR} 2>/dev/null &";

cat $HOME/.dwm/scripts/startup/client/terminal.sh | egrep -v "(^#.*|^$)"

me=`basename $0`;
running=`ps h -C $me | grep -v $$ | wc -l`;
[[ $running > 1 ]] && exit;
for i in 1 2
do
       cd $HOME;bash -c 'st -c my_tag3 -e tmux' &
done;
for i in 1 2
do
       cd $HOME;bash -c 'st -c my_tag2 -e sudo tmux' &
done;

cat $HOME/.dwm/scripts/startup/client/chrome.sh | egrep -v "(^#.*|^$)"

ABBR='google-chrome'
PROCESS='chrome'
KillExistsProcess()
{
        while true; do
                for i in `ps h -C ${PROCESS} | grep -v $$ | awk '{print $1}'| uniq`;
                do
                        kill -9 ${i};
                done
                sleep 1
                running=`ps h -C ${PROCESS} | grep -v $$ | wc -l`;
                [[ $running = 0 ]] && break;
        done
}
KillExistsProcess
running=`ps h -C ${PROCESS} | grep -v $$ | wc -l`;
if [[ $running = 0 ]]; then
        # rm -rf ~/.local/share/keyrings/*
        sudo -u user sh -c "${ABBR} 2>/dev/null &"
else
        KillExistsProcess
fi

★★★★

Последнее исправление: bryak (всего исправлений: 2)

Ты думаешь кто-то интересно разбираться в портянках твоих скриптов?

Сделай логирование в файл и анализируй. Выхлоп команд (притом как stdin, так и sdterr), коды возврата, значения переменных (особенно, если они вычисляются через другую команду) и т. п.

Kroz ★★★★★
()

И вообще, скрипты - капец.

PROCESS='chrome'
KillExistsProcess()
{
        while true; do
                for i in `ps h -C ${PROCESS} | grep -v $$ | awk '{print $1}'| uniq`;
                do
                        kill -9 ${i};
                done
...

заменяется на
killall "$PROCESS"

И перестань использовать -9 там, где это не нужно.

Чтобы не городить конструкции вида
...
running=`ps h -C $me | grep -v $$ | wc -l`;
...

Используют .pid файлы. Загляни в openrc'шны скрипты как там это сделано.

Отсутствие двойных кавычек при использовании переменных когда-то сослужит тебе плохую службу; так что лучше завести привычку. А вместо `` рекомендую использовать $() .

Kroz ★★★★★
()

Шизофазия в скриптах. От них нужно избавиться и написать нормальный скрипт автозапуска с нуля.

Bfgeshka ★★★★★
()

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

r3lgar ★★★★★
()

running=`ps h -C $me | grep -v $$ | wc -l`;

Сам догадаешься, почему этот grep будет русской рулеткой?

router ★★★★★
()
Ответ на: комментарий от router

Если тебе позарез нужно городить костыли, вместо использования pid файлов, обозначай границы слов, либо лучше используй конструкции вида

grep "[p]rogram"

Обрати внимание на скобки. Эта тупая регулярка, не меняющая цель поиска, исключает из вывода сам grep

Про логирование тебе уже всё сказали. гугли на предмет

exec 1>$log 2>&1
set -x
router ★★★★★
()
Последнее исправление: router (всего исправлений: 1)
Ответ на: комментарий от r3lgar

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

«я крутой мегахакир и обязательно напишу лучше тебя»

router ★★★★★
()
Ответ на: комментарий от router

Нет, просто у меня уже есть обкатанный костыль, в котором код более читабельный. Хоть это по-прежнему костыль.

r3lgar ★★★★★
()
Ответ на: комментарий от r3lgar

«скоро» а затем «просто». Пока существует тред, можно было бы уже допилить и выложить.

bryak ★★★★
() автор топика

Ко всему сказанному выше, лично я поставил бы интервалы sleep побольше. С запасом в 30-50% ко времени, нужному на запуск. Так диск будет захлёбываться. Долго? Надо правильно выбрать, что после старта понадобится в первую очередь. Торренты например можно и потом подтянуть.

А ещё такие портянки надо писать постепенно, по 1-2 строчке. И промежуточно тестировать пока не будет работать как часы. А отдельные скрипты гонять отдельно.

kirill_rrr ★★★★★
()
Ответ на: комментарий от bryak

Пока существует тред, можно было бы уже допилить и выложить.

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

«скоро» а затем «просто»

Выложу, но он уже полгода работает и жрать не просит. Правда, он прибит к zsh и жрёт ужасную конструкцию вместо конфига. И да, тоже без pid-файлов.

r3lgar ★★★★★
()
Ответ на: комментарий от r3lgar

«скоро» --> «просто» --> «Вот брошу всё» --> «равда, он прибит к zsh» --> «жрёт ужасную конструкцию вместо конфига»

bryak ★★★★
() автор топика

Запускалка

RUN_PATH="/home/${USER}/.dwm/scripts/startup/client"
for file in `ls -v $RUN_PATH`; do
	[ -f "${RUN_PATH}/$file" ] && [ -x "${RUN_PATH}/$file" ] && "${RUN_PATH}/${file}"
done

Пример запускаемого скрипта:

cat .dwm/scripts/startup/client/02_keepassx.sh

#!/bin/bash


TARGET="keepassx"
ARGS=""

if [[ -x "$(command -v ${TARGET})" ]]; then
        sudo -u $USER sh -c "${TARGET} ${ARGS} 2>/dev/null &"
fi

Только вот опять же, когда в скриптах типа echo «zzz» - всё работает, а когда туда 10 скриптов зальешь со всеми реальными тузлами, то 3 выполняется и оно дохнет. Почему ?

bryak ★★★★
() автор топика
Последнее исправление: bryak (всего исправлений: 1)
Ответ на: комментарий от bryak

//тред нечитай - просто отвечай.

Запусти скрипт через bash -x.

PunkoIvan ★★★★
()
Последнее исправление: PunkoIvan (всего исправлений: 2)

Вот так всё работает.

RUN_PATH="/home/${USER}/.dwm/scripts/startup/client"
for file in `ls -v $RUN_PATH`; do
	[ -f "${RUN_PATH}/$file" ] && [ -x "${RUN_PATH}/$file" ] && sudo -u ${USER} bash -c "${RUN_PATH}/$file  2>/dev/null &"
done

cat .dwm/scripts/startup/client/02_keepassx.sh

#!/bin/bash


TARGET="keepassx"
PRELOAD=""
ARGS=""

if [[ -x "$(command -v ${TARGET})" ]]; then
        sudo -u $USER sh -c "${PRELOAD} ${TARGET} ${ARGS} 2>/dev/null &"
fi

bryak ★★★★
() автор топика
Ответ на: комментарий от r3lgar

Пользуясь случаем, хочу передать привет твоему zsh и «жрёт ужасную конструкцию вместо конфига», «просто» и «скоро» ;)

bryak ★★★★
() автор топика
Последнее исправление: bryak (всего исправлений: 1)
Ответ на: комментарий от bryak

Ладно, мне просто стыдно за тот код, что я тогда писал.

r3lgar ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.