Se nproc
for atingido, o kernel não permitirá que nenhum outro processo seja executado com as credenciais desse usuário, como você aprendeu. Isso significa que nenhuma sessão remota por SSH, sem su
ou sudo
, nem mesmo um programa definido para a conta deles.
Isso deixa você com raiz ou com o usuário se eles ainda tiverem uma sessão interativa em funcionamento. Como você excluiu o root, espere que seu usuário ainda tenha um shell em execução. Em caso afirmativo, deve haver funcionalidade suficiente incorporada em seu shell para eliminar alguns dos processos ofensivos. Você precisará aproveitar os recursos internos do shell para percorrer /proc
.
Por exemplo, se eu quisesse matar todos os meus bash
shells, eu poderia fazer algo assim, que só usa builtins do shell Bash:
pushd /proc && for pid in *; do
test "$pid" = "self" && continue # skip /proc/self
test -d "$pid" || continue # skip if not a directory
test -O "$pid" || continue # skip if we don't own it
read cmd < "${pid}/cmdline"
case "$cmd" in
*bash*) kill -9 $pid ;; # or whatever you want to do to it
esac
done && popd
Isso sofre algumas limitações, por isso não é infalível, mas deve ser útil na maioria dos casos.
-
Se houver um lote de processamento em execução, a expansão *
na parte superior do loop poderá resultar em sequências que excedam o comprimento máximo do comando . Se você se deparar com isso, poderá reduzir a expansão de curingas com várias execuções usando 1*
, 2*
, {1..3}*
ou algo assim.
-
/proc/${pid}/cmdline
contém uma lista delimitada por NULL, da qual o comando real é apenas um item. Eu não estou ciente de uma maneira de analisar corretamente essa string usando apenas Bash builtins. Como as strings são normalmente terminadas com um NULL, read
somente obterá o primeiro item, que pode ou não ser o nome do comando. Uma abordagem alternativa seria iterar sobre /proc/${pid}/stat
ou /proc/${pid}/status
.