Comment puis-je permettre à un utilisateur de hiérarchiser un processus en fonction de la gentillesse négative?

12

Je veux qu'un utilisateur exécute un processus spécifique sur le système avec une belle valeur négative. Je ne peux pas simplement bifurquer le processus en arrière-plan car ce programme spécifique est un serveur minecraft et je compte sur la ligne de commande pour contrôler le serveur.

Mon script bash actuel ressemble à ceci (la partie importante):

sleep 10 && \
sudo renice -n $NICENESS $(ps -u $(id -u) -o "%p:%c" | sed -n "s/:java$//p") & \
java -Xmx8G -Xms2G -jar minecraft_server.jar nogui    

sleepretarde simplement l'exécution de renice. renicelui-même utilise pspour vérifier un processus java en utilisant l'ID propre aux utilisateurs. Il peut y avoir d'autres instances de java apparaissant sous différents utilisateurs, mais le serveur minecraft fonctionne sous son propre minecraft utilisateur .

Je ne veux évidemment pas entrer de mot de passe à chaque démarrage du serveur.
depuis / etc / sudoers :

minecraft ALL = NOPASSWD: /etc/renice

Existe-t-il une manière plus élégante de procéder? L'utilisation simple nicen'est pas une option, sudo nice bashen combinaison avec l' option NOPASSWD: serait un grand problème de sécurité.

Baarn
la source

Réponses:

9

Le module pam_limits.so peut vous y aider.

Il vous permet de définir certaines limites sur des utilisateurs et des groupes individuels spécifiques ou des caractères génériques ou des plages d'utilisateurs et de groupes.

Les limites que vous pouvez définir sont généralement les paramètres ulimit mais également le nombre de sessions de connexion simultanées, les processus, le temps CPU, la priorité par défaut et la priorité maximale (renice). Consultez la page de manuel limits.conf pour en savoir plus.

Par exemple, vous pouvez configurer votre groupe mindcraft pour que tous ses processus démarrent avec une priorité par défaut accrue et vous pouvez leur permettre d'utiliser les commandes nice et renice pour augmenter manuellement la priorité de leurs tâches importantes au lieu de réduire uniquement la priorité.

# /etc/security/limits.conf
# increase default and max prio for members of the mindcraft group
@mindcraft   hard priority -10
@mindcraft   hard nice     -18   
HBruijn
la source
4
Ne fixer que la limite stricte pour nicene semble pas le faire, j'ai dû définir les deux en utilisant -.
Baarn
Cela ne semble pas du tout fonctionner pour moi sur Ubuntu 16.04. J'ai défini priority-10 et nice-15 et j'obtiens toujours "permission refusée" même lorsque j'essaie d'utiliser "nice -n -2" sur quelque chose. Dois-je redémarrer? Je viens de me déconnecter et de me reconnecter conformément à ce conseil .
Richard Wiseman
Mise à jour sur mon post précédent ... Depuis le redémarrage, j'ai découvert que le priorityparamètre a un effet, mais le niceparamètre ne me permet que de réduire la priorité. Quand je commence quelque chose avec la priorité par défaut, c'est maintenant -10. Je peux faire renicele processus à -9 mais je ne peux pas renicerevenir à -10.
Richard Wiseman
Mise à jour 2: je l'ai résolu! C'est l'utilisation hardqui a causé les problèmes. Je l'ai changé à la -place et tout fonctionne bien maintenant. Cette réponse m'a aidé à aller au fond des choses. Je pense que le problème était que j'avais une limite douce qui se mettait en travers du chemin, dépassant peut-être la limite dure d'une manière ou d'une autre. Quoi qu'il en soit, -au lieu de le hardréparer pour moi.
Richard Wiseman
1

Utiliser renicesans sudoserait impossible. Je cite la renice(1)page de manuel:

Les utilisateurs autres que le super-utilisateur ne peuvent modifier que la priorité des processus dont ils sont propriétaires et ne peuvent augmenter de manière monotone que leur `` belle valeur '' (pour des raisons de sécurité) dans la plage de 0 à PRIO_MAX (20), sauf si une belle limite de ressources est set (Linux 2.6.12 et supérieur).

Joseph R.
la source