Estou executando o Ubuntu (via Regolith) e minha chave gpg é desbloqueada quando eu faço login. Estou executando várias operações de descriptografia em paralelo e notei que, se eu ultrapassar 7, gpg-agent
vou "esquecer" que a chave já está desbloqueada e sou solicitado a fazer uma pinentry.
❯ gpg --version
gpg (GnuPG) 2.2.27
libgcrypt 1.10.1
Fiz um exemplo mínimo de trabalho para demonstrar isso em python.
Crie um arquivo de teste para descriptografar com: echo "something" | gpg --encrypt -o test.gpg
. A execução gpg --decrypt test.gpg
no shell não solicita a senha.
Usando o script abaixo, se WORKERNUM
estiver definido abaixo de 8 (na minha máquina, mas defini-lo como 1, acho que deve funcionar para qualquer máquina), o script será descriptografado com satisfação, sem solicitar uma senha longa. Mas se eu aumentar para 8 ou mais, começo a receber solicitações para inserir minha senha, embora pareça que não é de todos os processos, apenas de alguns deles. A execução dos processos também obviamente começa a travar (presumo que eles estejam aguardando gpg-agent
).
import subprocess
import multiprocessing as mp
import time
the_queue = mp.Queue()
WORKERNUM = 7
def worker_main(queue):
while True:
msg = queue.get(True)
print(time.time(), msg)
out = subprocess.run(["gpg", "--decrypt", "test.gpg"], capture_output=True)
print(msg, time.time(), out.stdout)
the_pool = mp.Pool(WORKERNUM, worker_main, (the_queue,))
counter = 0
while True:
counter += 1
the_queue.put(counter)
print(the_queue.qsize())
while the_queue.qsize() > 10:
time.sleep(0.1)
Tentei passar --batch
para o comando decrypt, mas isso não mudou nada. Estive pesquisando as páginas de manual para gpg
ver gpg-agent
se há algo mencionado que possa estar relacionado a isso, mas não consegui encontrar nada. Eu tenho duas perguntas:
a) por que isso acontece eb) há algo que eu possa configurar para que, em vez de ter que descobrir o tamanho máximo do pool de processamento para evitar isso, gpg
lide com isso e não receba uma pinentry
Após um monitoramento cuidadoso,
journalctl
descobri que o erro realCannot allocate memory
era . Com base nesta discussão ,gpg-agent
a memória segura pode ficar sem memória se vários threads tentarem acessá-la.auto-expand-secmem 100
A configuração~/.gnupg/gpg-agent.conf
resolve o problema.