LINUX.ORG.RU
решено ФорумTalks

Безвременная и непостижимая смерть скрипта.

 ,


1

1

У меня есть скрипт:

#!/bin/sh
sleep 5s
for (( i=1; i <= 500000000000000000000; i++ ))
do
xdotool mousemove 700 100 click 3 key Alt+Tab sleep 2 
done

Запускается через хоткеи, назначенные в КДЕ. Убивается так же. Я могу запускать и убивать его раз по 10 в сутки, но приблизительно раз в неделю он умирает сам непонятно почему. Запускаешь - через полчаса максимум его уже нет. Сначала я думал - может счетчик заканчивается (было 50000), возможно при рестарте скрипта отсчет продолжался с прошлого момента. Но нет - добавил счетчик, всеравно умирает раз в неделю сам.

Как бы понять: 1) От чего он умирает? 2) Как бы это предотвратить?

★★★★★

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

Может для начала убрать пяток-десяток нулей? А то у вас вроде как число больше максимального для bash

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

Это максимум раз в неделю, а запусков за это время сотни. Я так просто не поймаю. Оно реально рандомно умирает.

А нахрена мне вообще фор? Попробую пока так:

while :
do
xdotool mousemove 700 100 click 3 key Alt+Tab sleep 2
done

Но жопой чую - не из за цикла это. Что то тут не так.

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

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

В том то и дело, что я не знаю кто помирает. Скрипт запустил, через 3 часа прихожу и скрипт уже пару часов как умер по факту.

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

Там со старта системы ничего нового не происходит обычно, я смотрел. Вот из последнего:

[   13.092604] usb 1-14: USB disconnect, device number 5
[   13.164094] input: HDA Intel PCH Mic as /devices/pci0000:00/0000:00:1f.3/sound/card0/input23
[   13.164198] input: HDA Intel PCH Mic as /devices/pci0000:00/0000:00:1f.3/sound/card0/input24
[   13.164293] input: HDA Intel PCH Headphone as /devices/pci0000:00/0000:00:1f.3/sound/card0/input25
[   13.164382] input: HDA Intel PCH HDMI/DP,pcm=3 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input26
[   13.164471] input: HDA Intel PCH HDMI/DP,pcm=7 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input27
[   13.164560] input: HDA Intel PCH HDMI/DP,pcm=8 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input28
[   13.164654] input: HDA Intel PCH HDMI/DP,pcm=9 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input29
[   13.164740] input: HDA Intel PCH HDMI/DP,pcm=10 as /devices/pci0000:00/0000:00:1f.3/sound/card0/input30
[   13.194278] usb 1-6: Found UVC 1.00 device HP Wide Vision HD Camera (04f2:b5d6)
[   13.214884] input: HP Wide Vision HD Camera: HP Wi as /devices/pci0000:00/0000:00:14.0/usb1/1-6/1-6:1.0/input/input31
[   13.215008] usbcore: registered new interface driver uvcvideo
calculate diver # [   13.215008] usbcore: registered new interface driver uvcvideo

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

xdotool работает с иксами, и если в этот момент там что-то происходит - он вполне может вылететь. Может быть связано с графической оболочкой, с видеодрайвером. Рассмотрите ydotool

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

Может, while true попробовать или как там в баше аналогичная конструкция выглядит, чтобы исключить проблемы со счетчиком? Скрипт же все равно постоянно висеть должен.

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

Похоже он только для систед: "– Package ‘systemd’, required by ‘virtual:world’, not found "

Тут сейчас действительно с иксами какие то непонятки возникают иногда. А точнее, скорее всего с мезой.

А какие еще альтернативы этим дутулам есть?

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

Пока сменил на такое:

while :
do
xdotool mousemove 700 100 click 3 key Alt+Tab sleep 2
done

Будем посмотреть.

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

Запускается через хоткеи, назначенные в КДЕ.

Кстати, а кто получается у баша родительский процесс? Может, там родитель падает.

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

Ну визуально он главный подозреваемый. Логируй код выполнения и не фейли весь скрипт.

ya-betmen ★★★★★
()
Ответ на: комментарий от thesis

https://cdn.discordapp.com/attachments/811217303378329643/1072089993243275274/prnt.png

Неа, не может быть. Если бы умер кдед5, у меня бы рухнули все кеды, а они живее всех живых. Сейчас при запущенном скрипте попробовал убить плазму и квин - скрипт работал.

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

Если бы умер кдед5, у меня бы рухнули все кеды

Не знаю, как там в кедах кишки расположены. Ты проверял? Убеждался, что кеды не запускают несколько этих кдедов? Речь даже не про «умер», а про «решил перезапуститься, угробив детей» - это ж кеды, кто их знает.
Ну и стоит добавить логирование кода возврата xdotool.

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

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

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

Если бы умер кдед5, у меня бы рухнули все кеды

Нет, не рухнули бы.

alex1101
()

может есть еще живой аналог крона с секундной точностью?

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

Не должен конечно, но чему там вообще вылетать? Каким-то образом происходящее внутри скрипта видимо влияет. Или сам xdtool, или та игрушка, по которой он кликает.

TC, может что даст set -x в скрипт и писать выхлоп в файл?

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

Вылет xdotool-а никак не скрипт не повлияет

Там слип сделал через xdotool, так что в теории может быть, что оно быстро проматывает оставшиеся операции до конца. Их правда много. Короче предложение ОП, сделать sleep отдельно.

goingUp ★★★★★
()

он умирает сам непонятно почему

Очевидно, осознаёт свою бесполезность...

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

Блин, да ты гений. Так и сделаю сейчас попробую. А там посмотрим.

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

Если в вовке начнут отслеживать каждое нажатие каждого игрока, никаких ресурсов не хватит на все это. Главное шибко не наглеть.

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

Вылет xdotool-а никак не скрипт не повлияет

Ускорит выполнение в дохрена раз. У него же пауза тоже в xdotool сделана.
То есть, если возникает ситуация, при которой xdotool начинает всегда завершаться по ошибке сразу на старте, то скрипт шустро проматывает цикл до конца и прекращается.
Интересно, что там будет после перехода на while...do.

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

Разнес цикл и хдутул в разные скрипты. Понаблюдаю пока. Если перестанет падать - значит хдутул, если не перестанет - возможно кеды.

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

скрипт через nohup не пробовал запустить?

А если запустить в screen?

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

Ну, первое что в голову пришло. Ну и мы же не знаем что у него там падает. Ну а так, да, может и & поможет.

Loki13 ★★★★★
()

Как бы понять: 1) От чего он умирает? 2) Как бы это предотвратить?

Я бы в такой ситуации вставил в скрипт логирование и запускал бы всё это под strace. В логах может быть ответ.

i-rinat ★★★★★
()
Ответ на: комментарий от Loki13

У меня тут такой вопрос. Я попробовал избавиться еще и от кде в качестве родителя скрипта. Запускаю через sxhkd. И тут проблема: как мне это убить правильно скриптом?

https://cdn.discordapp.com/attachments/811217303378329643/1072226182654869745/scrpt.png

При запуске от кде у него было имя скрипта и я убивал его через killall bool2. А тут как?

Не, можно наверное killall sh, но я так точно ничего лишнего не убью?

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

Не в тему, вы пояснили, но вот это 500000000000000000000 сильно много для баша, оно в такое не умеет, закончится гораздо раньше :)

anc ★★★★★
()

Замени xdotool на ydotool и запускай через systemd-run. Как минимум у тебя останется в журнале инфа почему оно умерло

no-dashi-v2 ★★
()
Последнее исправление: no-dashi-v2 (всего исправлений: 1)
Ответ на: комментарий от LightDiver

Громоздко, жирно,тупо, но зато удобно, повесь скрипт на F5 например. Один раз нажал, скрипт запустился, второй раз нажал скрипт грохнулся и никуда прописывать ничего не надо. Хотя проблема надо перед F5 мышкой кликнуть куданить. А то горячая клавиша не срабатывает.

#! /bin/env lua

-- имя файла по работы скрипта --
-- его необходимо создать вручную
-- иначе скрипт не запустится 
-- а то мало ли может у тебя уже
-- такой файл есть и перезапишется
-- файл создать в хомяке нужно
local signal_file_name = '.signal'
----------------------------------
local signal_file = os.getenv('HOME')..'/'..signal_file_name;
local file = io.open(signal_file);

if(file) then
    local stat = file:read('*all');
    file:close();
    if stat == 'working' then
       file = io.open(signal_file,'w');
       file:write('stop');
       return 0;
    else
       file = io.open(signal_file,'w');
       file:write('working');
       file:close();
    end

    while(true) do
        file = io.open(signal_file);
        stat = file:read('*all');
        file:close();
        if stat == 'working' then
        ------ тело того что нужно крутить в цикле, остальное не трогать ------
            os.execute("xdotool mousemove 700 100 click 3 key Alt+Tab sleep 2");
        -----------------------------------------------------------------------
        else 
            break;
        end
    end
end

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 2)
Ответ на: комментарий от LINUX-ORG-RU

Огромное спасибо. Сам задумывался о подобном. Попробую.

LightDiver ★★★★★
() автор топика
11 марта 2023 г.
Ответ на: комментарий от LINUX-ORG-RU

Смотри, есть такой скрипт:

#! /bin/env lua

local signal_file_name = '.coffee'
local signal_file = os.getenv('HOME')..'/'..signal_file_name;
local file = io.open(signal_file);

if(file) then
    local stat = file:read('*all');
    file:close();
    if stat == 'working' then
       file = io.open(signal_file,'w');
       file:write('stop');
       os.execute("sh /home/diver/Скрипты/bool1.sh");
       return 0;
    else
       file = io.open(signal_file,'w');
       file:write('working');
       file:close();
    end

    while(true) do
        file = io.open(signal_file);
        stat = file:read('*all');
        file:close();
        if stat == 'working' then
            for coffee=1, 10 do
                if coffee == 10 then
                    os.execute("sh /home/diver/Скрипты/coffee.sh");
                else 
                     os.execute("sleep 1");
                end 
            end
        else
            break;
        end
    end
end

Таймер для кофе на 6 минут. Он запускается, работает. После срабатывания триггера, даже по нажатию умирает. А не подскажешь как сделать, чтобы по нажатию умирал до срабатывания триггера? Допустим, если запустил его по ошибке, вторым нажатием сразу убить, не дожидаясь полного выполнения?

LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LINUX-ORG-RU

Еще сейчас пытаюсь вот это засунуть сюда же:

progress=$(kdialog --progressbar "Кофе" 360);

for i in $(seq 1 360);
    do
        qdbus $progress Set "" value $i > /dev/null;
        sleep 1
    done

Прогрессбар визуальный.. Правда он у меня тоже получается неубиваемый какой то. С запуском все норм, а как это все убивать, я чот не понимать.

LightDiver ★★★★★
() автор топика
Последнее исправление: LightDiver (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

вот это у меня coffee.sh:

#!/bin/bash
env DISPLAY=:0
mpv --force-window=no /home/diver/Загрузки/Музыка/12/coffee.mp3 &
PID=$!
trap 'kill -9 ${PID}' SIGTERM SIGKILL EXIT
wait $PID

А вот это bool1.sh, которым я это все пытаюсь убивать:

#!/bin/sh

killall bool2.sh
killall sh
killall alarm.sh
LightDiver ★★★★★
() автор топика
Ответ на: комментарий от LightDiver

Эммммм, я что-то жестоко туплю. Погоди что-то не так, или у меня кукушка поехала или на баг наткнулся.

LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LightDiver

Как то так, джолжно работать, повторный запуск, грохает предыдущий, новый запуск начинает всё сначала.

#! /bin/env lua

local signal_file_name = '.coffee'
local signal_file = os.getenv('HOME')..'/'..signal_file_name;
local file = io.open(signal_file);

if(file) then
    local stat = file:read('*all');
    file:close();
    if stat == 'working' then
       file = io.open(signal_file,'w');
       file:write('stop');
       return 0;
    else
       file = io.open(signal_file,'w');
       file:write('working');
       file:close();
       stat="working";
    end
    local timer = 360;
    -- получаум ID прогессбара
    local qpopen = io.popen('kdialog --progressbar "Кофе" '..timer..' ',"r");
    local qprogress_id    = qpopen:read("*l");
    local play_sound = true;
    -- теперь мы крутим цикл не вечно, но оставляем его
    while(stat=="working") do
            -- заводим цикл отправки сообщений прогрессбару
            for coffee=1, timer ,1 do
                -- теперь проверяем стастус в цикле 
                -- отправки счётчика прогрессбару
                -- а не выше как раньше, логика иная
                file = io.open(signal_file,'r');
                stat = file:read('*all');
                file:close();
                -- если повторно нажать хоткей
                -- значением поменяется на стоп
                -- выходим из цикла прогрессбара
                -- и задаём оснанов для основного цикла
                if stat == "stop" then 
                    play_sound=false; 
                    stat="stop"
                    break; 
                end
                --шлём счётчик прогрессбару
                local qdbus = 'qdbus '..qprogress_id..' Set "" value '..tostring(coffee)..' >/dev/null';
                os.execute(qdbus);
                os.execute("sleep 1")
            end
            -- проигрываем музыку тогда и только тогда когда завешилось естественно
            -- если прервали играть не надо ибо зачем, а главное ****я
            if play_sound == true then 
               -- если музыка не просто тилинь тилинь короткая, а целая песня 
               -- то будет играть до победного и только тогда всё завершится корректно
               -- если у тебя тут музыка длинная то надо делать детекст нажатия в окне
               -- прогресс бара кнопочки "закрыть" и в фоне грохать музыку
               -- для этого уже надо завести отдельный поток который будет это делать
               -- я не очень уверен надо ли оно тебе именно так, подразумеваю что у тебя
               -- музыка просто тилинь-тилинь недолгая
               os.execute("mpv --force-window=no /home/diver/Загрузки/Музыка/12/coffee.mp3");
            end
            -- всегда грохаем прогресс бар после достижения таймером финала
            -- опять же я не знаю по окончанию таймера оно должно висеть или нет
            -- закомментируй если надо что-бы перед глазами маячило
            os.execute("qdbus "..qprogress_id.." org.kde.kdialog.ProgressDialog.close");
            -- после того как в любом случае завершился прогресс бар 
            -- посылаем сигнал сами себе что мы всё. 
            file = io.open(signal_file,'w');
            file:write('stop');
        end
    end

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

Предыдущий скрипт не предполагал что запускаемая программа сама в себе будет иметь цикл, а если он есть во вне да ещё сам запускает другие программы то просто грохнуть всё не получится нужны пиды (как ты делал) и вот всё это, имхо пердолинг, но дело хозяйское конечно.

LINUX-ORG-RU ★★★★★
()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 3)
Закрыто добавление комментариев для недавно зарегистрированных пользователей (со score < 50)