Ошибка при открытии Spectacle

jobs сообщает о заданиях, которые могут иметь более одного процесса.

В интерактивном режиме задания помещаются в группы процессов, поэтому их можно приостановить/возобновить/прервать как единое целое.

jobs -p(как в zsh, так и вbash)возвращают идентификатор группы процессов каждого задания, а не идентификаторы всех процессов в задании.

Когда оболочка не работает в интерактивном режиме (при отсутствии управления заданиями ), оболочка сообщает pid процесса, который был бы лидером группы процессов при наличии управления заданиями (, что может не быть таким же, как тот, который был возвращен в $!между прочим ).

$ sleep 1 | sleep 20 &
[1] 29643 29644
$ jobs -p
[1]  + 29643 done       sleep 1 |
             running    sleep 20

zsh сообщает, что для задания 2 pgid 29643 zsh запустил 2 процесса, один из которых уже выполнен, а другой все еще выполняется.

Если вы хотите получить только pgids, как в bash, вы можете передать это так:

awk '/^\[/{print $3}'

Если вы хотите получить pids в задании (только те, которые запущены оболочкой ), вы можете посмотреть $jobstatesспециальный ассоциативный массив:

$ typeset jobstates
jobstates=( 1 'running:+:29643=done:29644=running' )

Чтобы извлечь pid процессов, все еще работающих в задании 1:

$ echo ${${(M)${(s/:/)jobstates[1]}:#*=running}%=*}
29644

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

Вы можете убить группу процессов с идентификатором 29643 с помощью kill -- -29643, kill 29643уничтожит только процесс с идентификатором 29643 (, который уже мертв в нашем примере выше ).

Здесь было бы более разумно передавать номера заданий вместо pid или pgid (, которые не будут работать в не -интерактивных оболочках )для уничтожения. Вот для чего нужны номера вакансий:

kill %${(k)^jobstates}

К сожалению, я не думаю, что bashимеет надежный эквивалент.

bash-4.4$ sleep $(: '
> [213]...') 2134 &
[1] 29856
bash-4.4$ jobs
[1]+  Running                 sleep $(: '
[213]...') 2134 &

Из этого трудно достоверно извлечь номера вакансий. (Я также обнаружил, что даже while kill %; do continue; doneне работает из-за того, что выглядит как ошибка условий гонки ).

Обратите внимание, что когда вы не работаете в интерактивном режиме, управление заданием отсутствует, поэтому, когда вы kill %1завершаете задание номер 1, это задание не имеет группы процессов. Таким образом, как приближение бедняка, оболочка (, как bash, так и zsh), вместо этого убьет каждый процесс , о котором она знает . В нашем примере выше вместо:

kill(-29643, SIGTERM);

сойдет:

kill(29643, SIGTERM);
kill(29644, SIGTERM);

Это не уничтожит другие процессы (, если таковые )были созданы этими двумя процессами, хотя это все же лучше, чем уничтожение только 29643, как в вашем kill $(jobs -p)подходе.

1
01.02.2021, 18:37
1 ответ

Попробуйте это:

$ sudo apt install libkcolorpicker0=0.1.4-1+20.04+focal+build1
3
18.03.2021, 22:33

Теги

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