Невозможно убить остановленные задания скриптом bash

Это нужно, чтобы определить размер вашего раздела и где он начинается/заканчивается. Если вы хотите иметь только один большой раздел, укажите 0% для начала и 100% для конца. Затем для нескольких разделов вы можете играть с процентами или секторами.

Например, если вы хотите разделить диск на 2 раздела

  • 0% 50% для первого
  • 50% 100% для 2-го

должен выполнить задание

0
26.04.2021, 19:07
1 ответ

Встроенная функция killраспознает формат %Nтолько для заданий, выполняемых в текущей оболочке. Однако сценарии оболочки выполняются в своей собственной отдельной подоболочке, и в этой подоболочке нет заданий, которые нужно убить. Это может быть понятнее на примере:

$ for i in {1..5}; do sleep 100 & done
[1] 2259152
[2] 2259153
[3] 2259154
[4] 2259155
[5] 2259156
$ for i in {1..5}; do kill %$i; done
[1]   Terminated              sleep 100
[2]   Terminated              sleep 100
[3]   Terminated              sleep 100
[4]-  Terminated              sleep 100
[5]+  Terminated              sleep 100

Как видите, это работает должным образом, если вы запускаете оба набора команд в одном и том же сеансе оболочки. Точно так же это работает, если вы запускаете и уничтожаете команды из одного и того же сценария оболочки :

.
#! /usr/bin/env bash
for i in {1..5}; do
  sleep 100 &
done

## Show the running jobs
runningSleepJobs=$(pgrep -c sleep)
echo "There are $runningSleepJobs sleep jobs running!"

for i in {1..5}; do
  kill %$i;
done
## Show that they've been stopped
runningSleepJobs=$(pgrep -c sleep)
echo "Now there are $runningSleepJobs sleep jobs running!"

Если я сейчас запущу этот скрипт, я увижу, что он и запускается, и затем уничтожает задания, как и ожидалось:

$ foo.sh
There are 5 sleep jobs running!
Now there are 0 sleep jobs running!

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

$ cat ~/bin/foo.sh
#! /usr/bin/env bash
for i in $( seq 1 $1 )
do
        kill %$i
done

$ for i in {1..5}; do sleep 100 & done
[1] 2295221
[2] 2295222
[3] 2295223
[4] 2295224
[5] 2295225

$ jobs
[1]   Running                 sleep 100 &
[2]   Running                 sleep 100 &
[3]   Running                 sleep 100 &
[4]-  Running                 sleep 100 &
[5]+  Running                 sleep 100 &

$. ~/scripts/foo.sh 5
[1]   Terminated              sleep 100
[2]   Terminated              sleep 100
[3]   Terminated              sleep 100
[4]-  Terminated              sleep 100
[5]+  Terminated              sleep 100
2
28.04.2021, 22:50

Теги

Похожие вопросы