Comment démarrer un processus avec une belle valeur de -20 sans lui donner le privilège root?

18

Je voudrais démarrer un processus avec une belle valeur de -20. Cela nécessite que j'utilise une commande comme - sudo nice -n -20 matlab. Cependant, cela démarre aussi matlab en tant que root. Existe-t-il un moyen d'avoir matlab en tant que non root?

Mon approche actuelle est - sudo nice -n -20 sudo -u myusername matlab- qui, pour moi, ressemble à un hack. Existe-t-il une approche directe pour ce faire?

Lord Loh.
la source
Vous devriez pouvoir simplement déposer le fichier sudo. rootn'est pas nécessaire pour optimiser votre propre processus.
jordanm
8
Si vous souhaitez définir une priorité plus élevée que la valeur par défaut, vous avez besoin d'un superutilisateur. (-20 est la priorité la plus élevée.) La seule autre façon de penser à cela serait de sudo renice après son démarrage. Cependant, puisque vous exécutez matlab de manière interactive, c'est plus facile à dire qu'à faire.
Alan Shutko
1
Pas un hack, c'est la voie à suivre.
Hauke ​​Laging
@jordanm - Sans sudo, c'est la bonne commande - nice -n -20 matlabet c'est la sortie nice: impossible de définir la gentillesse: autorisation refusée. Matlab démarre et la bonne valeur est 0.
Lord Loh.
@AlanShutko - Je pourrais exécuter system('sudo renice ...')dans MATLAB, mais matlab démarre 2 processus - MATLAB et matlab_helper. Je devrais peut-être le faire sur les deux. en outre, je souhaite également que tous mes processus MATLAB soient hautement prioritaires - lorsque je démarre matlabpool local pour un traitement parallèle. @HaukeLaging - Je commence à penser que vous avez raison.
Lord Loh.

Réponses:

20

Je le démarrerais normalement et utiliserais ensuite "renice" ...

Cependant, j'ai pu faire un hack rapide avec "su" qui fonctionne:

sudo nice -n -20 su -c command_to_run user_to_run_as

(Si vous n'avez pas besoin de donner un mot de passe à sudo - peut-être parce que vous venez de le donner - vous pouvez ajouter un "&" pour mettre le tout en arrière-plan.)

Puisque vous êtes déjà devenu root avec la commande sudo, su ne vous demandera pas de mot de passe. J'ai pu démarrer un programme X à partir d'un émulateur de terminal sous X. Si vous souhaitez exécuter le programme X en tant qu'un autre utilisateur que l'utilisateur propriétaire de la session X, vous devrez probablement dire explicitement à X de l'autoriser. (ouvert pour les clients X de cet utilisateur).

Baard Kopperud
la source
1
Je vous remercie. Je pense donc que la façon dont je me figurais était la seule façon de faire.
Lord Loh.
Cela marche! La seule chose que je rencontre maintenant, c'est que je n'ai pas de sortie standard. Comment résoudre ça? Par exemple, sudo nice -n 19 su -c $(echo "test")ne donne aucune sortie.
DrumM
Mon mauvais, vous devez faire sudo nice -n 19 su -c "echo 'test'"' When you want to run a function in su -c do`, voir stackoverflow.com/a/3727572/2522849
DrumM
8

Un pas de plus @ Jordan, voici la solution élégante contre le sudo nice -n -xx su <username> -c matlabpiratage

Remarque: En utilisant username = sid , matlab meta-data dir = / var / lib / matlab , nice = -10 change as your will

  1. Créer un répertoire de métadonnées matlab (PERPARE)

    sudo mkdir /var/lib/matlab

  2. Ajouter un utilisateur spécifié pour lancer matlab et persimisson droit

    sudo useradd -d / var / lib / matlab sid
    sudo chown sid: sid / var / lib / matlab
  1. Définir le mot de passe utilisateur (Sid)

    sudo passwd sid

  2. Ajoutez le suivant à /etc/security/limits.conf

    sid - priority -10

  3. Configurer et copier la clé ssh pour automatiser la connexion (FACULTATIF)

    ssh-keygen -t rsa #following key passwd misc   
    ssh-copy-id sid @ localhost #using sid's passwd
  1. Créer un wrapper matlab shell (correction de l' ERR d'échec silencieux )
    sudo -i
    cat> / usr / local / bin / wmatlab
    #! / bin / bash -
    # Un wrapper pour lancer matlab
    / usr / local / MATLAB / <version> / bin / matlab -desktop
    EOF
    chmod + x / usr / local / bin / wmatlab
  1. Le shell de connexion d'Ajust Sid

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

  2. démarrer matlab en utilisant ssh avec Xforward

    ssh -X sid@localhost

Jiahao D.
la source
2
ce devrait être la réponse acceptée.
user47093
4

J'ai trouvé que cela pouvait être fait en modifiant le fichier /etc/security/limits.conf(au moins sur certaines distributions Linux). Dans mon cas, j'ai simplement ajouté

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

alors vous pouvez exécuter

nice -n -20 matlab

guyik
la source
Après avoir effectué cette modification, vous devez
shaneb
2

Comme l'a dit @jordanm drop sudo. Vous pouvez améliorer vos propres processus pour leur donner une priorité inférieure:

nice -20 matlab

Non sudo.

John
la source
Cela n'a pas fonctionné. system('ps a -o pid -o comm -o nice')m'a compris 13580 MATLAB 19- MATLAB fonctionne avec la priorité la plus basse au lieu de la plus élevée. Ma question était de savoir comment augmenter la priorité et non la réduire.
Lord Loh.
Sans sudo, c'est la bonne commande - nice -n -20 matlabet c'est la sortie nice: cannot set niceness: Permission denied. Matlab démarre et la bonne valeur est 0.
Lord Loh.
3
OP ne veut pas augmenter la priorité (nice négatif), c'est-à-dire. "nice --20 mathlab" (double -) dans l'ancienne notation, "nice -n -20 mathlab" dans la nouvelle. Seul root peut utiliser des gentilles valeurs négatives.
Baard Kopperud
1
CAP_SYS_NICE permettrait également à l'OP de le faire sans privilèges root, mais implique de se plonger dans les capacités de Linux (quelque chose que peu de gens comprennent et pourraient être plus de travail que cela ne vaut). Je le mentionne juste par souci d'exhaustivité.
Bratchley
1

pam vous permet de fixer des limites sur nice par groupe son fichier de configuration:

@grnice hard priority -20

@grnice hard nice -20

Et assurez-vous que le groupe le processus s'exécute dans grnice.

Jordan
la source
1

Ajoutez l'utilisateur à sudoers (en fait, un nouveau fichier dans /etc/sudoers.d, mais c'est la même prémisse):

niceuser ALL=NOPASSWD:/usr/bin/nice

Ensuite, en tant que "niceuser":

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

et il fait ce dont j'ai besoin (c'est-à-dire que mon utilisateur peut désormais augmenter la priorité de {commande ...}). Il prend en charge plusieurs utilisateurs, etc. - utilisez man 5 sudoerspour plus de détails.

raclette
la source
4
Cela exécute toujours la commande en tant que root, ce que l'affiche essaie d'éviter.
Kyle Butt
1

Une autre option possible (simple, mais moins sécurisée) consiste à activer l'autorisation setuid / setgid pour l' niceexécutable.

sudo chmod +s /usr/bin/nice

setuid attribue à tout utilisateur qui peut exécuter le fichier l'UID effectif du propriétaire du fichier (dans ce cas root) lors de l'exécution du fichier, est donc équivalent à l'exécution de cet utilisateur. setguid fait de même pour un GID efficace.


Ou vous pouvez le faire en toute sécurité:

# 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>

Attention, vous devez vous reconnecter à votre compte pour que le nouveau groupe prenne effet.

Shou Ya
la source