Bagaimana cara meningkatkan batas FD maksimum untuk proses daemon yang berjalan di bawah pengguna tanpa kepala?

5

Untuk meningkatkan batas FD untuk proses daemon yang berjalan di bawah pengguna tanpa kepala di mesin Linux Ubuntu kami melakukan perubahan berikut di /etc/security/limits.conf

soft nofile 10000
hard nofile 10000

Kami juga menambahkan sesi yang diperlukan pam_limits.so di /etc/pam.d/login. Perubahan mendapat tercermin untuk semua pengguna yang logout dan login lagi. Apa pun proses baru yang dimulai di bawah para pengguna mendapatkan batas FD baru.

Tetapi untuk daemon yang berjalan di bawah pengguna tanpa kepala, perubahan tidak tercermin. apa cara perubahan yang dapat tercermin untuk daemon yang berjalan di bawah pengguna tanpa kepala?

Ameliorator
sumber
mungkin posting ini dapat membantu Anda superuser.com/questions/404239/...
c4f4t0r

Jawaban:

3

Masalahnya ada di skrip peluncuran daemon. Itu menggunakan setuidgid untuk menjalankan daemon di bawah pengguna tanpa kepala. Terlihat seperti setuidgid tidak akan menginstal batas sumber daya yang ditetapkan dalam membatasi.conf saat mengubah pengguna / grup untuk proses tersebut. Daemon harus berhati-hati dalam menetapkan batas sumber daya untuk dirinya sendiri melalui skrip peluncurannya. Dengan menetapkan batas FD maksimum untuk sesi saat ini di skrip peluncuran, batas baru dapat direfleksikan untuk daemon. Ini dilakukan dengan memasukkan garis ulimit -n seperti di bawah ini dalam skrip lauching dari daemon.

ulimit -n $NEW_MAX_LIMIT
exec setuidgid userxyz /pat/to/daemon.sh
Ameliorator
sumber
1
Itu dia. Banyak layanan akan dianemonisasi tanpa berkonsultasi dengan PAM dan mengabaikan / etc / security / limit. Kadang-kadang mereka mengutak-atik batas diri mereka sendiri sebelum melepaskan hak root (seperti Nginx), kadang-kadang Anda melakukannya secara eksplisit dengan 'ulimit' sebelumnya (seperti dengan Apache). Terkadang saya menempatkan file 'ulimit -n XXX' di file / etc / default / <service>, bekerja dengan baik hampir sepanjang waktu.
zerodeux
2

Anda dapat membaca / mengatur batas sumber daya dari proses yang berjalan dengan prlimit (1), bagian dari util-linux:

sudo prlimit --pid PID --nofile 8192:16384
akal
sumber
Bagi saya, perintah tidak berfungsi sebagaimana mestinya. Saya menggunakan ini: -. "prlimit --pid PID --nofile = 8192"
piyush
0

Mem-boot ulang pasti akan membereskannya. Tapi saya berasumsi Anda ingin menghindarinya. (siapa yang tidak?)

Jadi, Anda perlu HUP proses init. Ini hampir selalu berjalan pada PID 1, tetapi Anda mungkin ingin memeriksa ulang pada sistem Anda. Ini bukan hal yang paling aman untuk dilakukan, tetapi bisa menghindari reboot itu. Jadi, silakan coba ini di kotak tes terlebih dahulu:

kill -HUP 1

Christopher Karel
sumber
Terima kasih atas jawabannya, Christopher. Ya, Anda menebaknya dengan benar, saya mencoba untuk menghindari reboot. Saya mencoba ini tetapi tidak berhasil.
Ameliorator
Hmm ... bisakah Anda lebih spesifik dengan apa yang Anda maksud dengan "pengguna tanpa kepala"? Apakah pekerjaan cron ini, daemon yang ada, menelurkan utas baru, dll? Mungkin ada sesuatu yang lebih spesifik yang Anda butuhkan untuk HUP.
Christopher Karel
Ini adalah kata sandi lebih sedikit userid. Kami meluncurkan proses produksi kami di bawah userid ini. Jika saya melakukan cat pada passwd dll, saya mendapatkan ini sebagai output.cat / etc / passwd | grep userxyz Output: userxyz: x: 1015: 1015: userxyz headless user: / home / userxyz: / bin / bash
Ameliorator
Ada skrip shell yang ada yang memulai penjadwal pekerjaan azkaban menggunakan exec setuidgid userxyz /path/to/azkaban/launching/script.sh Azkaban kemudian secara berkala akan meluncurkan proses lainnya. Jadi pada akhirnya proses berjalan di bawah userxyz
Ameliorator
Saya tidak terlalu akrab dengan Azkaban, tetapi bukankah itu memiliki proses daemon persisten berjalan? Jika demikian, HUPing daemon Azkaban mungkin melakukan apa yang Anda butuhkan.
Christopher Karel
-1

Anda dapat mengatur batas-batas proses yang berjalan menggunakan procfs.

Temukan ID proses yang ingin Anda ubah (dalam hal ini 1234), kemudian jalankan:

pid=1234        # This is the process ID, found with `ps`.
h_nofile=16384  # hard limit of "Max open files"
s_nofile=8192   # soft limit of "Max open files"
grep "Max open files" /proc/$pid/limits
echo -n "Max open files=$s_nofile:$h_nofile" > /proc/$pid/limits
grep "Max open files" /proc/$pid/limits

Metode ini tidak lagi didukung oleh kernel terbaru. Alternatifnya adalah menggunakan prlimitseperti yang disebutkan @nous.

Mircea Vutcovici
sumber
Ini tidak berhasil untuk saya: echo: write error: Invalid argument
Old Pro
Anda perlu menjalankan sebagai root atau sebagai pengguna yang sama dengan proses.
Mircea Vutcovici
Menjalankan itu sebagai root juga tidak berhasil.
timurb
Bekerja untuk saya di RHEL 6.2 kernel 2.6.32-279.14.1.el6.x86_64. Saya dimodifikasi untuk mengatur ukuran inti max dalam proses yang berjalan. Saya percaya "-n" untuk gema diperlukan, kalau tidak "tulis kesalahan: argumen tidak valid". Membutuhkan kernel 2.6.32 atau lebih tinggi. Jika prosesnya bukan milik Anda, Anda perlu root / sudo.
RaveTheTadpole
Ya, -nwajib. Itu akan menekan baris baru.
Mircea Vutcovici