ulimité um shell embutido, não um comando externo. Ele precisa ser incorporado porque atua no próprio processo do shell, como cd: os limites, como o diretório atual, são propriedade desse processo específico.
sudo bash -c 'ulimit -n 4096'funcionaria, mas alteraria o limite do processo bash invocado sudosomente, o que não ajudaria.
Existem dois valores para cada limite: o limite rígido e o limite flexível. Somente a raiz pode aumentar o limite rígido; qualquer pessoa pode diminuir o limite máximo, e o limite mínimo pode ser modificado em qualquer direção, com a única restrição de que não pode ser maior que o limite máximo. O limite flexível é o valor real que importa.
Portanto, é necessário organizar que todos os seus processos tenham um limite fixo para arquivos abertos de pelo menos 4096. Você pode manter o limite flexível em 1024. Antes de iniciar o processo que requer muitos arquivos, aumente o limite flexível. Em /etc/security/limits.conf, adicione as linhas
paislee hard nofile 4096
paislee soft nofile 1024
onde paisleeé o nome do usuário para o qual você deseja executar seu processo. No shell que inicia o processo para o qual você deseja um limite mais alto, execute
ulimit -Sn unlimited
para aumentar o limite flexível para o limite rígido.
ulimit 4096não funciona. Eu acho que-nestá correto. Como prova de conceito, funciona se eu primeirosudo su - root(mas apenas muda para raiz).