Je dois exécuter dosemu
avec Nice --20
à partir du script. Le problème est le suivant: une valeur négative ne peut être appliquée qu'avec Sudo.
Connaissez-vous un moyen d'exécuter la commande Nice
sans Sudo
ou simplement d'exécuter Nice --20 dosemu
à partir d'un script?
Malheureusement, je ne pense pas que ce soit facilement faisable.
Si votre processus dosemu s'exécute en tant qu'utilisateur distinct, vous pouvez définir la priorité de tous les processus de cet utilisateur sur une valeur négative à l'aide de /etc/security/limits.conf
.
EDIT: bête moi, vous ne peut pas créer un script shell suid, ça ne marche pas.
EDIT2: OK, vous pouvez configurer Sudo pour qu'il ne vous oblige pas à donner un mot de passe lorsqu'un membre du groupe Sudo exécute Nice ou renice. Dans une fenêtre de terminal, entrez
Sudo visudo
Cela ouvrira un éditeur de texte simple qui modifiera la configuration de Sudo. Ajoutez la ligne suivante à la fin du fichier:
%Sudo ALL = (ALL) NOPASSWD: /usr/bin/Nice,/usr/bin/renice
Quittez l'éditeur. L'éditeur s'assurera que la syntaxe est correcte (sinon, on pourrait casser le système). Maintenant, vous pouvez courir
Sudo Nice -n -20 Sudo -u $USER /some/program
et vous ne serez pas invité à entrer un mot de passe. En fait, Nice va lancer un autre processus appelé Sudo avec la priorité -20. Ce nouveau processus Sudo reviendra à votre utilisateur d'origine (-u $USER
, sinon vous exécuterez le programme/some/en tant que root) et démarrerez/some/programme.
essaye ça:
Sudo -k Nice -n -20 su -c "dosemu" $USER
pendant qu'il tourne, lancez ceci:
ps -A --forest -o pid,user,command |grep dosemu
vous verrez que Nice
a été exécuté avec les privilèges root, mais dosemu
a été exécuté en tant que $ USER normal.
Comprenez comment c'est sûr: pour vous assurer qu'il n'y a pas de faille, essayez ceci. Vous verrez qu'il demande le mot de passe deux fois, parce que Sudo ls
est exécuté avec $ USER normal, donc le script avec Sudo ne fonctionnera pas inaperçu:
Sudo -k Nice -n -5 su -c "Sudo ls" $USER
et cela demandera le mot de passe une seule fois car il est déjà root sur Sudo ls
:
Sudo -k Nice -n -5 su -c "Sudo ls" root
PS: au lieu de dosemu, pour les tests, j’ai utilisé sleep 120
, et Sudo -k
est destiné à renforcer la sécurité.
Essayez: Sudo -s -H
Il vous connecte en tant que root, après quoi vous n’avez plus besoin de Sudo.
Ensuite, lancez votre script.