Bagaimana cara memulai proses dengan nilai bagus -20 dan tidak memberikannya root privilege?

18

Saya ingin memulai proses dengan nilai bagus -20. Ini mengharuskan saya untuk menggunakan perintah seperti - sudo nice -n -20 matlab. Namun, ini juga memulai matlab sebagai root. Apakah ada cara untuk memiliki matlab sebagai non-root?

Pendekatan saya saat ini adalah - sudo nice -n -20 sudo -u myusername matlab- yang bagi saya terlihat seperti retasan. Apakah ada pendekatan langsung untuk melakukan ini?

Tuan Loh.
sumber
Anda harus dapat hanya menjatuhkan sudo. roottidak diperlukan untuk memperbaiki proses Anda sendiri.
jordanm
8
Jika Anda ingin menetapkan prioritas yang lebih tinggi daripada standar, Anda perlu superuser. (-20 adalah prioritas tertinggi.) Satu-satunya cara lain yang bisa saya pikirkan untuk melakukan ini adalah dengan sudo renice setelah dimulai. Namun, karena Anda menjalankan matlab secara interaktif, itu lebih mudah diucapkan daripada dilakukan.
Alan Shutko
1
Bukan peretasan, itulah jalannya.
Hauke ​​Laging
@jordanm - Tanpa sudo, ini adalah perintah yang benar - nice -n -20 matlabdan ini adalah output yang bagus: tidak dapat mengatur kebaikan: Izin ditolak. Matlab dimulai dan nilai yang bagus adalah 0.
Lord Loh.
@AlanShutko - Saya bisa menjalankan system('sudo renice ...')di MATLAB, tetapi matlab memulai 2 proses - MATLAB dan matlab_helper. Saya mungkin harus melakukannya pada keduanya. selain itu saya juga ingin semua proses MATLAB saya menjadi prioritas tinggi - ketika saya mulai matlabpool local untuk pemrosesan paralel. @ HaukeLaging - Saya mulai berpikir Anda benar.
Tuan Loh.

Jawaban:

20

Saya akan memulainya secara normal dan menggunakan "renice" setelah itu ...

Namun saya dapat melakukan peretasan cepat bersama dengan "su" yang berfungsi:

sudo nice -n -20 su -c command_to_run user_to_run_as

(Jika Anda tidak harus memberikan kata sandi pada sudo - mungkin karena Anda baru saja memberikannya - Anda dapat menambahkan "&" untuk meletakkan semuanya di latar belakang.)

Karena Anda sudah menjadi root dengan perintah sudo, su tidak akan meminta kata sandi. Saya dapat memulai program-X dari terminal-emulator di bawah X. Jika Anda ingin menjalankan program-X sebagai pengguna lain daripada pengguna yang memiliki sesi-X, Anda mungkin harus secara eksplisit memberi tahu X untuk mengizinkannya. (terbuka untuk klien-X dari pengguna itu).

Baard Kopperud
sumber
1
Terima kasih. Jadi saya pikir cara saya pikir adalah satu-satunya cara untuk melakukannya.
Tuan Loh.
Ini bekerja! Satu-satunya hal yang saya temui sekarang adalah bahwa saya tidak memiliki output standar. Bagaimana cara mengatasinya? Misalnya sudo nice -n 19 su -c $(echo "test")tidak memberikan output.
DrumM
Buruk saya, Anda perlu melakukan sudo nice -n 19 su -c "echo 'test'"' When you want to run a function in su -c do`, lihat stackoverflow.com/a/3727572/2522849
DrumM
8

Selangkah lebih maju @Jordan, Ini solusi elegan melawan sudo nice -n -xx su <username> -c matlabhack

Catatan: Menggunakan username = sid , mat-data meta-dir data = / var / lib / matlab , nice = -10 ubah sesuka Anda

  1. Buat mat -data meta-data dir (PERPARE)

    sudo mkdir /var/lib/matlab

  2. Tambahkan pengguna yang ditentukan untuk meluncurkan matlab & kesempurnaan kanan

    sudo useradd -d / var / lib / matlab sid
    sudo chown sid: sid / var / lib / matlab
  1. Tetapkan kata sandi pengguna (sid)

    sudo passwd sid

  2. Tambahkan berikut ini ke /etc/security/limits.conf

    sid - priority -10

  3. Setup & salin ssh-key untuk mengotomatiskan login (OPTIONAL)

    ssh-keygen -t rsa #following key passwd misc   
    ssh-copy-id sid @ localhost # menggunakan passwd sid
  1. Buat matlab shell wrapper (fix silent fail ERR )
    sudo -i
    cat> / usr / local / bin / wmatlab
    #! / bin / bash -
    # Pembungkus untuk meluncurkan matlab
    / usr / local / MATLAB / <version> / bin / matlab -desktop
    EOF
    chmod + x / usr / local / bin / wmatlab
  1. Shell login Ajust sid

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

  2. mulai matlab menggunakan ssh dengan Xforward

    ssh -X sid@localhost

Jiahao D.
sumber
2
ini harus menjadi jawaban yang diterima.
user47093
4

Saya menemukan ini bisa dilakukan dengan memodifikasi file /etc/security/limits.conf(setidaknya pada beberapa distro linux). Dalam kasus saya, saya hanya menambahkan

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

maka Anda bisa mengeksekusi

nice -n -20 matlab

guyik
sumber
Setelah melakukan perubahan ini, harus keluar / masuk lagi: unix.stackexchange.com/q/108603/247665
shaneb
2

Seperti @jordanm berkata drop sudo. Anda dapat memperbaiki proses Anda sendiri untuk memberi mereka prioritas yang lebih rendah:

nice -20 matlab

Tidak ada sudo.

John
sumber
Ini tidak berhasil. system('ps a -o pid -o comm -o nice')mengerti 13580 MATLAB 19- MATLAB berjalan dengan prioritas terendah, bukan tertinggi. Pertanyaan saya adalah bagaimana cara meningkatkan prioritas dan tidak menguranginya.
Tuan Loh.
Tanpa a sudo, ini adalah perintah yang benar - nice -n -20 matlabdan ini adalah output nice: cannot set niceness: Permission denied. Matlab dimulai dan nilai yang bagus adalah 0.
Lord Loh.
3
OP ingin tidak meningkatkan prioritas (baik negatif), yaitu. "nice --20 mathlab" (double -) dalam notasi lama, "nice -n -20 mathlab" di yang baru. Hanya root yang dapat menggunakan nilai bagus negatif.
Baard Kopperud
1
CAP_SYS_NICE juga akan memungkinkan OP untuk melakukan ini tanpa hak root, tetapi melibatkan menggali kemampuan Linux (sesuatu yang tidak banyak orang mengerti dan mungkin lebih banyak pekerjaan daripada nilainya). Saya hanya menyebutkannya demi kelengkapan.
Bratchley
1

pam memungkinkan Anda untuk menetapkan batas pada bagus per grup file konfigurasinya:

@grnice prioritas keras -20

@ Grnice hard bagus -20

Dan pastikan grup proses berjalan di grnice.

Yordania
sumber
1

Tambahkan pengguna ke sudoers (sebenarnya, file baru di /etc/sudoers.d, tetapi dengan premis yang sama):

niceuser ALL=NOPASSWD:/usr/bin/nice

Kemudian, sebagai "pengguna yang baik":

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

dan itu melakukan apa yang saya butuhkan (yaitu, pengguna saya sekarang dapat meningkatkan prioritas {command ...}). Ini mendukung banyak pengguna, dll. - gunakan man 5 sudoersuntuk detail.

squeegee
sumber
4
Itu masih menjalankan perintah sebagai root, yang ingin dihindari oleh poster.
Kyle Butt
1

Opsi lain yang mungkin (sederhana, tetapi kurang aman) adalah mengaktifkan setuid / setgid untuk nicedieksekusi.

sudo chmod +s /usr/bin/nice

setuid menugaskan pengguna yang dapat mengeksekusi file UID efektif dari pemilik file (dalam hal ini root) ketika mengeksekusi file, dengan demikian sama dengan menjalankan sebagai pengguna. setguid melakukan hal yang sama untuk GID yang efektif.


Atau Anda dapat melakukannya dengan lebih aman:

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

Hati-hati Anda perlu login kembali akun Anda agar grup baru berlaku.

Shou Ya
sumber