Jak rozpocząć proces z ładną wartością -20 i nie dać mu uprawnień roota?


18

Chciałbym rozpocząć proces z niezłą wartością -20. Wymaga to użycia polecenia takiego jak - sudo nice -n -20 matlab. Jednak to zaczyna matlab również jako root. Czy istnieje sposób, aby Matlab nie był rootem?

Moje obecne podejście to - sudo nice -n -20 sudo -u myusername matlab- które dla mnie wygląda na włamanie. Czy istnieje bezpośrednie podejście do tego?


Powinieneś być w stanie po prostu upuścić sudo. rootnie jest potrzebny do udoskonalenia własnego procesu.
Jordan

8
Jeśli chcesz ustawić wyższy priorytet niż domyślny, potrzebujesz administratora. (-20 jest najwyższym priorytetem.) Jedynym innym sposobem, w jaki mogę to zrobić, jest sudo renice po uruchomieniu. Ponieważ jednak korzystasz z Matlaba interaktywnie, łatwiej to powiedzieć niż zrobić.
Alan Shutko

1
Nie hack, to jest droga.
Hauke ​​Laging 18.04.13

@jordanm - Bez sudo jest to właściwe polecenie - nice -n -20 matlabi to jest dobre wyjście: nie można ustawić nicości: Odmowa zezwolenia. Matlab uruchamia się, a ładna wartość to 0.
Lord Loh.

@AlanShutko - Mógłbym uruchomić system('sudo renice ...')w MATLAB, ale matlab uruchamia 2 procesy - MATLAB i matlab_helper. Być może będę musiał to zrobić na obu. ponadto chcę, aby wszystkie moje procesy MATLAB miały wysoki priorytet - kiedy rozpoczynam matlabpool local przetwarzanie równoległe. @HaukeLaging - Zaczynam myśleć, że masz rację.
Lord Loh.

Odpowiedzi:


20

Zaczynam normalnie, a potem używam „renice” ...

Byłem jednak w stanie zrobić szybki hack razem z „su”, który działa:

sudo nice -n -20 su -c polecenie_do_wybierania_użytkownika do uruchomienia_as

(Jeśli nie musisz podawać sudo hasła - być może dlatego, że już je nadałeś - możesz dodać znak „&”, aby umieścić całość w tle.)

Ponieważ już jesteś rootem za pomocą polecenia sudo, su nie poprosi cię o hasło. Byłem w stanie uruchomić program X z emulatora terminala pod X. Jeśli chcesz uruchomić program X jako inny użytkownik niż użytkownik będący właścicielem sesji X, prawdopodobnie będziesz musiał wyraźnie powiedzieć X, aby zezwolił na to (otwarte dla klientów X od tego użytkownika).


1
Dziękuję Ci. Myślę więc, że sposób, w jaki pomyślałem, był jedynym sposobem na zrobienie tego.
Lord Loh.

To działa! Jedyne, z czym się teraz spotykam, to brak standardowego wyjścia. Jak to rozwiązać? Np. Nie sudo nice -n 19 su -c $(echo "test")daje danych wyjściowych.
DrumM

Mój zły, musisz zrobić sudo nice -n 19 su -c "echo 'test'"' When you want to run a function in su -c do`, patrz stackoverflow.com/a/3727572/2522849
DrumM

8

Krok dalej @Jordan, oto eleganckie rozwiązanie przeciwko sudo nice -n -xx su <username> -c matlabhakowaniu

Uwaga: Używanie nazwy użytkownika = sid , matlab meta-data katalog = / var / lib / matlab , nice = -10 zmiana do woli

  1. Utwórz katalog metadanych Matlab (PERPARE)

    sudo mkdir /var/lib/matlab

  2. Dodaj określonego użytkownika, aby uruchomić matlab i właściwą persimisson

    sudo useradd -d / var / lib / matlab sid
    sudo chown sid: sid / var / lib / matlab
  1. Ustaw hasło użytkownika (sid)

    sudo passwd sid

  2. Dołącz następujące do /etc/security/limits.conf

    sid - priority -10

  3. Skonfiguruj i skopiuj klucz SSH, aby zautomatyzować logowanie (OPCJONALNIE)

    ssh-keygen -t rsa #następujący klucz passwd misc   
    ssh-copy-id sid @ localhost # using sid's passwd
  1. Utwórz opakowanie powłoki Matlaba (napraw ERR cichego niepowodzenia )
    sudo -i
    cat> / usr / local / bin / wmatlab
    #! / bin / bash -
    # Opakowanie do uruchomienia Matlaba
    / usr / local / MATLAB / <wersja> / bin / matlab -desktop
    EOF
    chmod + x / usr / local / bin / wmatlab
  1. Powłoka logowania Aid Sid

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

  2. uruchom matlab używając ssh z Xforward

    ssh -X sid@localhost


2
to powinna być zaakceptowana odpowiedź.
user47093,

4

Odkryłem, że można to zrobić, modyfikując plik /etc/security/limits.conf(przynajmniej w niektórych dystrybucjach Linuksa). W moim przypadku po prostu dodałem

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

wtedy możesz wykonać

nice -n -20 matlab


Po wprowadzeniu tej zmiany należy się wylogować / zalogować ponownie: unix.stackexchange.com/q/108603/247665
shaneb

2

Jak powiedział @jordanm, upuść sudo. Możesz ładnie przetwarzać własne procesy, aby nadać im niższy priorytet:

nice -20 matlab

Nie sudo.


To nie zadziałało. system('ps a -o pid -o comm -o nice')masz mnie 13580 MATLAB 19- MATLAB działa z najniższym priorytetem zamiast z najwyższym. Moje pytanie dotyczyło sposobu zwiększenia priorytetu, a nie jego zmniejszenia.
Lord Loh.

Bez a sudojest to właściwe polecenie - nice -n -20 matlabi to jest wynik nice: cannot set niceness: Permission denied. Matlab uruchamia się, a ładna wartość to 0.
Lord Loh.

3
PO nie chce zwiększać priorytetu (negatywny miły), tj. „nice -20 mathlab” (podwójne -) w starym zapisie, „nice -n -20 mathlab” w nowym. Tylko root może używać ujemnych wartości Nice.
Baard Kopperud,

1
CAP_SYS_NICE pozwoliłby OP zrobić to bez uprawnień roota, ale wymaga zagłębienia się w możliwości Linuksa (coś, co niewiele osób rozumie i może być więcej pracy niż jest warte). Po prostu wspominam o tym dla zachowania kompletności.
Bratchley,


1

pam pozwala ustawić limity na plik konfiguracyjny nice dla grupy:

@grnice twardy priorytet -20

@grnice hard nice -20

I upewnij się, że grupa proces przebiega w grnice.


1

Dodaj użytkownika do sudoers (tak naprawdę nowy plik w /etc/sudoers.d, ale to ta sama przesłanka):

niceuser ALL=NOPASSWD:/usr/bin/nice

Następnie jako „miły użytkownik”:

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

i robi to, czego potrzebuję (to znaczy, że mój użytkownik może teraz zwiększyć priorytet {polecenie ...}). Obsługuje wielu użytkowników itp. - użyj w man 5 sudoerscelu uzyskania szczegółowych informacji.


4
To nadal uruchamia polecenie jako root, a tego próbuje uniknąć plakat.
Kyle Butt,

1

Inną możliwą opcją (prostą, ale mniej bezpieczną) jest włączenie uprawnień setuid / setgid dla nicepliku wykonywalnego.

sudo chmod +s /usr/bin/nice

setuid przypisuje każdemu użytkownikowi, który może wykonać plik, efektywny identyfikator UID właściciela pliku (w tym przypadku root) podczas wykonywania pliku, a więc jest równoważny z uruchomieniem tego użytkownika. setguid robi to samo dla efektywnego GID.


Lub możesz to zrobić bezpieczniej:

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

Pamiętaj, że musisz ponownie zalogować się na swoje konto, aby nowa grupa zaczęła obowiązywać.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.