colrm
(часть util-linux
, уже должна быть установлена в большинстве дистрибутивов )кажется, гораздо лучше справляется с интернационализацией:
$ echo 'αβγ' | colrm 3
αβ
$ echo 'αβγ' | colrm 2
α
Остерегайтесь нумерации :colrm N
удалит столбцы из N
, печатая символы до N-1
.
(кредиты)
Обычный ответ на такого рода вещи заключается в том, что вы должны послать сигнал процессу группе , а не только процессу. Все процессы, порожденные firefox
, должны находиться в одной группе процессов. Действительно, в моей системе:
$ ps -aeo pgid,ppid,pid,s,comm,args | grep -E '[f]irefox|[P]PID'
PGID PPID PID S COMMAND COMMAND
1095 1 151407 S firefox /usr/lib/firefox/firefox
1095 151407 151541 S Web Content /usr/lib/firefox/firefox -contentproc -childID 1 -isForBrowser -prefsLen 1 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151607 S WebExtensions /usr/lib/firefox/firefox -contentproc -childID 2 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151689 S Web Content /usr/lib/firefox/firefox -contentproc -childID 3 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151711 S Web Content /usr/lib/firefox/firefox -contentproc -childID 4 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151738 S Web Content /usr/lib/firefox/firefox -contentproc -childID 5 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151765 S Web Content /usr/lib/firefox/firefox -contentproc -childID 6 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151802 S Web Content /usr/lib/firefox/firefox -contentproc -childID 7 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151876 S Web Content /usr/lib/firefox/firefox -contentproc -childID 8 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151889 S Web Content /usr/lib/firefox/firefox -contentproc -childID 9 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151928 S Privileged Cont /usr/lib/firefox/firefox -contentproc -childID 10 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
Обычно я мог просто запустить kill -19 -1095
, и это приостановило бы работу всех членов группы процессов 1095
. К сожалению, по крайней мере, в моей системе эта группа содержит не только Firefox :
$ ps -aeo pgid,ppid,pid,s,comm,args | awk '$1==1095' | wc
104 1382 29087
В этой группе 104 процесса, включая такие базовые инструменты, как Xorg или мой вход в менеджер дисплея. Так что, хотя технически это будет работать, поскольку он приостановит работу Firefox, он также приостановит весь мой графический интерфейс, из-за чего система перестанет отвечать.
Вместо этого вы можете использовать флаг -f
дляpkill
:
-f, --full
The pattern is normally only matched against the process name. When -f is set, the full command line is used.
Если я сейчас запущу pkill -f -19 firefox
, все процессы, чья командная строка соответствует firefox
, будут приостановлены (посмотрите на столбец S
):
$ pkill -f -19 firefox
$ ps -aeo ppid,pid,s,comm,args | grep -E '[f]irefox|[P]PID'
PGID PPID PID S COMMAND COMMAND
1095 1 151407 T firefox /usr/lib/firefox/firefox
1095 151407 151541 T Web Content /usr/lib/firefox/firefox -contentproc -childID 1 -isForBrowser -prefsLen 1 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151607 T WebExtensions /usr/lib/firefox/firefox -contentproc -childID 2 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151689 T Web Content /usr/lib/firefox/firefox -contentproc -childID 3 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151711 T Web Content /usr/lib/firefox/firefox -contentproc -childID 4 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151738 T Web Content /usr/lib/firefox/firefox -contentproc -childID 5 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151765 T Web Content /usr/lib/firefox/firefox -contentproc -childID 6 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151802 T Web Content /usr/lib/firefox/firefox -contentproc -childID 7 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151876 T Web Content /usr/lib/firefox/firefox -contentproc -childID 8 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151889 T Web Content /usr/lib/firefox/firefox -contentproc -childID 9 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
1095 151407 151928 T Privileged Cont /usr/lib/firefox/firefox -contentproc -childID 10 -isForBrowser -prefsLen 136 -prefMapSize 225550 -parentBuildID 20200603085854 -appdir /usr/lib/firefox/browser 151407 true tab
Конечно, это означает, что если у вас есть, например, текстовый файл с именем firefoxManual
, открытый в текстовом редакторе, или любой другой процесс, соответствующий firefox
, он также будет приостановлен.
В качестве альтернативы, если вы хотите быть на 100% уверены, что получаете только правильные процессы, вы можете получить PID Firefox, а затем отправить сигнал ему и всем процессам, у которых он является родительским идентификатором:
pkill -19 firefox; pgrep -P $(pgrep firefox) | xargs kill -19
Вы могли бы даже превратить это в функцию:
myKill(){
pkill "$1" "$2"; pgrep -P $(pgrep "$2") | xargs kill "$1"
}
И теперь вы можете остановить их всех с помощью:
myKill -19 firefox
И перезапустите с помощью:
myKill -18 firefox
Конечно, ваш Linux уже обновлен до cgroups v2 и вашID=1000
:
systemd-run --user --slice=firefox.slice firefox
# To freeze
echo 1 > /sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/firefox.slice/cgroup.freeze
# To unfreeze
echo 0 > /sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/firefox.slice/cgroup.freeze
pkill
— отличный инструмент, который, по словам человека, «ищет или сигнализирует о процессах на основе имени». Более того, он соответствует нескольким процессам. Пока весь веб-контент и веб-расширения работают с одним и тем же именем файла, мы можем использовать pkill -19 firefox-esr
для приостановки как можно большего количества ВСЕХ дочерних процессов .
В какой-то момент это может быть небезопасно, и если мы хотим сопоставить конкретную установку Firefox (, но все экземпляры ), мы можем запросить PID с помощью fuser
(, чтобы показать, какие процессы используют указанный компьютерный файл):fuser /usr/lib/firefox-esr/firefox-esr | grep -Es "[0-9]+" | xargs kill -19
(-18 для возобновления ).
Последний результат можно проверить с помощью конкатенации | xargs ps
, которая выводит статус процессов как 'Sl' (прерываемый спящий режим, многопоточный -многопоточный ).