Como inicio um processo com um bom valor de -20 e não concedo privilégios de root?

18

Gostaria de iniciar um processo com um bom valor de -20. Isso requer que eu use um comando como - sudo nice -n -20 matlab. No entanto, isso também inicia o matlab como root. Existe uma maneira de ter o matlab como não raiz?

Minha abordagem atual é - sudo nice -n -20 sudo -u myusername matlab- que, para mim, parece um hack. Existe uma abordagem direta para fazer isso?

Lorde Loh.
fonte
Você deve ser capaz de simplesmente largar o arquivo sudo. rootnão é necessário para agradar seu próprio processo.
Jordanm 18/04
8
Se você deseja definir uma prioridade mais alta que a padrão, é necessário um superusuário. (-20 é a prioridade mais alta.) A única outra maneira de pensar em fazer isso seria sudo renice após o início. No entanto, como você está executando o matlab interativamente, é mais fácil falar do que fazer.
Alan Shutko
1
Não é um truque, é o caminho a percorrer.
Hauke Laging
@jordanm - Sem um sudo, este é o comando certo - nice -n -20 matlabe este é o resultado legal: não é possível definir a gentileza: permissão negada. O Matlab inicia e o bom valor é 0.
Lord Loh.
@ AlanShutko - Eu poderia rodar system('sudo renice ...')no MATLAB, mas o matlab inicia 2 processos - MATLAB e matlab_helper. Eu posso ter que fazer isso em ambos. além disso, também quero que todos os meus processos MATLAB sejam de alta prioridade - quando inicio o matlabpool local processamento paralelo. @HaukeLaging - Estou começando a pensar que você está certo.
Senhor Loh.

Respostas:

19

Eu começaria normalmente e usaria "renice" depois ...

No entanto, eu fui capaz de fazer um hack rápido junto com "su", que funciona:

sudo nice -n -20 su -c command_to_run user_to_run_as

(Se você não precisar fornecer uma senha ao sudo - talvez porque você já a tenha fornecido - você pode adicionar um "&" para colocar tudo em segundo plano.)

Como você já se tornou root com o comando sudo, o su não solicitará uma senha. Consegui iniciar um programa X a partir de um emulador de terminal no X. Se você deseja executar o programa X como outro usuário que não seja o proprietário da sessão X, provavelmente precisará informar explicitamente o X para permitir (aberto para clientes X desse usuário).

Baard Kopperud
fonte
1
Obrigado. Então eu acho que o jeito que imaginei era a única maneira de fazer.
Senhor Loh.
Isso funciona! A única coisa que estou encontrando agora é que não tenho saída padrão. Como resolver isso? Por exemplo, sudo nice -n 19 su -c $(echo "test")não dá saída.
DrumM
Meu mal, você precisa fazer sudo nice -n 19 su -c "echo 'test'"' When you want to run a function in su -c do`, consulte stackoverflow.com/a/3727572/2522849
DrumM
8

Um passo adiante, Jordan, aqui está a solução elegante contra o sudo nice -n -xx su <username> -c matlabhack

Nota: Utilizando username = sid , meta de dados meta do matlab = / var / lib / matlab , nice = -10 muda conforme sua vontade

  1. Criar dir de metadados do matlab (PERPARE)

    sudo mkdir /var/lib/matlab

  2. Adicione o usuário especificado para iniciar o matlab e o persimisson direito

    sudo useradd -d / var / lib / sid do matlab
    sid chown do sudo: sid / var / lib / matlab
  1. Definir senha do usuário (sid)

    sudo passwd sid

  2. Anexe o seguinte a /etc/security/limits.conf

    sid - priority -10

  3. Configure e copie a chave ssh para automatizar o login (OPCIONAL)

    ssh-keygen -t rsa #following chave passwd misc   
    ssh-copy-id sid @ localhost # usando a senha do sid
  1. Criar wrapper de shell matlab (corrigir erro silencioso de falha no ERR )
    sudo -i
    cat> / usr / local / bin / wmatlab
    #! / bin / bash -
    # Um wrapper para lançar o matlab
    / usr / local / MATLAB / <versão> / bin / matlab -desktop
    EOF
    chmod + x / usr / local / bin / wmatlab
  1. Shell de login do Ajust sid

    sudo usermod -s /usr/local/bin/wmatlab sid

  2. inicie o matlab usando ssh com o Xforward

    ssh -X sid@localhost

Jiahao D.
fonte
2
essa deve ser a resposta aceita.
user47093
4

Eu descobri que isso poderia ser feito modificando o arquivo /etc/security/limits.conf(pelo menos em algumas distros do linux). No meu caso, eu simplesmente adicionei

#<domain> <type> <item> <value> my_user - nice -20

então você pode executar

nice -n -20 matlab

guyik
fonte
Depois de fazer essa alteração, faça o logoff / logon novamente: unix.stackexchange.com/q/108603/247665
shaneb em
2

Como @jordanm disse drop sudo. Você pode agregar seus próprios processos para dar a eles uma prioridade mais baixa:

nice -20 matlab

Não sudo.

John
fonte
Isso não funcionou. system('ps a -o pid -o comm -o nice')entendi 13580 MATLAB 19- o MATLAB está sendo executado com a prioridade mais baixa em vez da mais alta. Minha pergunta era sobre como aumentar a prioridade e não reduzi-la.
Senhor Loh.
Sem a sudo, este é o comando certo - nice -n -20 matlabe esta é a saída nice: cannot set niceness: Permission denied. O Matlab inicia e o bom valor é 0.
Lord Loh.
3
O OP não quer aumentar a prioridade (negativo agradável), ie. "nice - 20 mathlab" (duplo -) na notação antiga, "nice -n -20 mathlab" na nova notação. Somente o root pode usar valores agradáveis ​​negativos.
precisa saber é o seguinte
1
O CAP_SYS_NICE também permitiria que o OP fizesse isso sem privilégios de root, mas envolve explorar os recursos do Linux (algo que muitas pessoas não entendem e podem dar mais trabalho do que vale a pena). Eu apenas menciono isso por uma questão de perfeição.
Bratchley
1

O pam permite definir limites em nice por grupo seu arquivo de configuração:

@grnice hard prioridade -20

@grnice hard nice -20

E certifique-se de que o grupo o processo seja executado em grnice.

Jordânia
fonte
1

Adicione o usuário aos sudoers (na verdade, um novo arquivo em /etc/sudoers.d, mas é a mesma premissa):

niceuser ALL=NOPASSWD:/usr/bin/nice

Então, como o "niceuser":

niceuser@localhost $ sudo nice -n -10 command...

e faz o que eu preciso (ou seja, meu usuário agora pode aumentar a prioridade de {command ...}). Ele suporta vários usuários, etc. - use man 5 sudoerspara obter detalhes.

rodo
fonte
4
Isso ainda executa o comando como root, que é o que o pôster está tentando evitar.
Kyle Bundas
1

Outra opção possível (simples, mas menos segura) é ativar a permissão setuid / setgid para niceexecutável.

sudo chmod +s /usr/bin/nice

O setuid atribui a qualquer usuário que possa executar o arquivo o UID efetivo do proprietário do arquivo (neste caso root) ao executar o arquivo; portanto, é equivalente à execução como esse usuário. setguid faz o mesmo para GID efetivo.


Ou você pode fazê-lo com mais segurança:

# create a system group named `nice'
groupadd -r nice

# set the owner group for `nice' executable
chgrp nice /usr/bin/nice

# disallow other users to run `nice`
chmod o-x /usr/bin/nice

# allow anyone who are able to execute the file gain a setuid as root
chmod u+s /usr/bin/nice

# add your user to the group
usermod -a -G nice <your-user-name>

Lembre-se de que você precisa fazer login novamente na sua conta para que o novo grupo entre em vigor.

Shou Ya
fonte