LinuxForum.Fans
Тема

Как остановить while работающий в фоновом режиме

Автор: Moritto 7 сообщений 1013 просмотров
25.06.2017 17:04 · отредактировано #423859

Вот код
[console]
#!/system/bin/bash

declare -i a=0 b=0

(while ((a<10));do
sleep 1
echo $$
((a++))
done &)

while ((b<5));do
sleep 2
echo $$
((b++))
done

echo Поехали

[/console]
Этот скрипт пишет одно и то же число, хоть и первый цикл запущен в subshell.
Искал решение так и не нашел, поэтому помогите страждущему

26.06.2017 19:08 · отредактировано #423874

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

text
#!/bin/bash

declare -i a=0 b=0 startic() { while ((a<100));do sleep 1 echo $$ ((a++)) done } #запускаем процесс startic & #определяем pid процесса pid=$!

while ((b<5));do sleep 2 echo DD=$$ #убиваем процесс kill $pid 2>/dev/null ((b++)) done

27.06.2017 00:29 · отредактировано #423878
ormorph написал:
не знаю зачем это нужно, но тогда либо через файл передавать, чтобы скрипт его считывал и уже в зависимости от содержания выполнял действия, либо просто убить:

Ща попробую

27.06.2017 00:33 #423879
ormorph написал:
не знаю зачем это нужно, но тогда либо через файл передавать, чтобы скрипт его считывал и уже в зависимости от содержания выполнял действия, либо просто убить:
text
#!/bin/bash

declare -i a=0 b=0 startic() { while ((a<100));do sleep 1 echo $$ ((a++)) done } #запускаем процесс startic & #определяем pid процесса pid=$!

while ((b<5));do sleep 2 echo DD=$$ #убиваем процесс kill $pid 2>/dev/null ((b++)) done

Весь прикол в том что это не работает, вот скрипт с отладкой:

text

#!/system/bin/bash -x

func() { local a=0 while [ "$a" -lt 10 ]; do echo $a let a+=1 new=$pid echo $new if [ "$a" -eq 5 ]; then echo $pid kill $pid fi sleep 1 done }

func & pid=$! echo pid $pid wait

echo pid $pid

вот целый лог:

Показать
text

+ func
+ echo pid 23167
+ local a=0
+ '[' 0 -lt 10 ']'
+ echo 0
0
+ let a+=1
+ new=
+ echo

+ '[' 1 -eq 5 ']' + sleep 1 + '[' 1 -lt 10 ']' + echo 1 1 + let a+=1 + new= + echo

+ '[' 2 -eq 5 ']' + sleep 1 + '[' 2 -lt 10 ']' + echo 2 2 + let a+=1 + new= + echo

+ '[' 3 -eq 5 ']' + sleep 1 + '[' 3 -lt 10 ']' + echo 3 3 + let a+=1 + new= + echo

+ '[' 4 -eq 5 ']' + sleep 1 + '[' 4 -lt 10 ']' + echo 4 4 + let a+=1 + new= + echo

+ '[' 5 -eq 5 ']' + echo

+ kill kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec] + sleep 1 + '[' 5 -lt 10 ']' + echo 5 5 + let a+=1 + new= + echo

+ '[' 6 -eq 5 ']' + sleep 1 + '[' 6 -lt 10 ']' + echo 6 6 + let a+=1 + new= + echo

+ '[' 7 -eq 5 ']' + sleep 1 + '[' 7 -lt 10 ']' + echo 7 7 + let a+=1 + new= + echo

+ '[' 8 -eq 5 ']' + sleep 1 + '[' 8 -lt 10 ']' + echo 8 8 + let a+=1 + new= + echo

+ '[' 9 -eq 5 ']' + sleep 1 + '[' 9 -lt 10 ']' + echo 9 9 + let a+=1 + new= + echo

+ '[' 10 -eq 5 ']' + sleep 1 + '[' 10 -lt 10 ']' + echo pid 23167 pid 23167

27.06.2017 07:45 #423881

Странно было бы если заработало...
Функция запускается в новом процессе bash, по этому pid в саму функцию не передаётся, так как присваивается после запуска функции. Для выхода из функции используется команда return.
Выше пример был для linux, в андроид нет /dev/null
Вот пример, у меня работает на termux норм.

text
#!/data/data/com.termux/files/usr/bin/bash
declare -i a=0 b=0
startic() {
while ((a<100));do
    sleep 1
    echo $$
    ((a++))
done
}
#запускаем процесс
startic &
#определяем pid процесса
pid=$!
echo pid=$pid
while ((b<5));do
    sleep 2
    echo DD=$$
    #убиваем процесс
    ((b++))
done
kill $pid

Кстати под kitkat норм роботает terminal ide, в её состав входит bash mc и многое...
Соединить комп с планшетом можно с помощью telnet, в результате будет работать норм консоль на компе.

27.06.2017 23:00 #423889
ormorph написал:
Странно было бы если заработало...
Функция запускается в новом процессе bash, по этому pid в саму функцию не передаётся, так как присваивается после запуска функции. Для выхода из функции используется команда return.
Выше пример был для linux, в андроид нет /dev/null
Вот пример, у меня работает на termux норм.
text
#!/data/data/com.termux/files/usr/bin/bash
declare -i a=0 b=0
startic() {
while ((a<100));do
    sleep 1
    echo $$
    ((a++))
done
}
#запускаем процесс
startic &
#определяем pid процесса
pid=$!
echo pid=$pid
while ((b<5));do
    sleep 2
    echo DD=$$
    #убиваем процесс
    ((b++))
done
kill $pid

Кстати под kitkat норм роботает terminal ide, в её состав входит bash mc и многое...
Соединить комп с планшетом можно с помощью telnet, в результате будет работать норм консоль на компе.

/dev/null в андроиде есть, это же мини линукс
[console]
ls -l /dev/null
crw-rw-rw- root root 1, 3 2017-06-27 17:26 null
[/console]
Termux пооный отстой так как на кит кат не работает.
Короче я поставил LinuxDeploy и а нём установил debian, теперь я любые проги могу ставить и это намного лучше чем просто терминал.

27.06.2017 23:42 #423892
"Moritto" написал:
/dev/null в андроиде есть, это же мини линукс

Ну да проверил, есть. Только linux его тяжело назвать, если только не из за ядра.

"Moritto" написал:
Termux пооный отстой так как на кит кат не работает.
Короче я поставил LinuxDeploy и а нём установил debian, теперь я любые проги могу ставить и это намного лучше чем просто терминал.

На много лучше иметь непосредственно linux рукой.
Ну удачи!

Войдите или зарегистрируйтесь, чтобы ответить.