Apakah ada cara mudah untuk membuat skrip rc FreeBSD?

9

Saya memiliki penjara FreeBSD tempat saya menjalankan server menggunakan perintah:

/usr/sbin/daemon /path/to/script.py

Saat ini saya harus menjalankan perintah ini setiap kali saya me-restart mesin dan jail mulai. Saya ingin perintah ini dimulai /etc/rc. Apakah ada cara mudah untuk membuat skrip rc FreeBSD untuk suatu daemonperintah?


UPDATE: Saya membaca dokumentasi BSD ini tentang skrip rc , dan dari situlah saya membuat skrip berikut di /etc/rc.d/pytivo:

#!/bin/sh

. /etc/rc.subr

name=pytivo
rcvar=pytivo_enable
procname="/usr/local/pytivo/pyTivo.py"

command="/usr/sbin/daemon -u jnet $procname"

load_rc_config $name
run_rc_command "$1"

Ini berfungsi untuk memulai skrip python yang saya inginkan sebagai daemon ketika jail dimulai ... (diberikan pytivo_enable="YES"ada di /etc/rc.conf) tetapi skrip rc tidak tahu apakah daemon sedang berjalan (menurutnya tidak saat itu) dan itu memberi peringatan ketika saya mencoba memulainya:

[root@meryl /home/jnet]# /etc/rc.d/pytivo start
[: /usr/sbin/daemon: unexpected operator
Starting pytivo.
[root@meryl /home/jnet]# 

Jadi sudah dekat , dan berfungsi , tapi saya merasa saya harus bisa mendapatkan fungsionalitas yang lebih baik dari ini.

Josh
sumber
Anda perlu meletakkan skrip ini di suatu tempat (Tidak ingat sekarang) dan meletakkan baris XX_enable="YES"di /etc/rc.conf untuk membuatnya mulai otomatis. Mulailah dengan menemukan skrip yang ada
daisy
Saya mencari cara mudah untuk membuat skrip ... Apakah ada skrip yang baik yang dapat saya salin dan gunakan kembali?
Josh

Jawaban:

11

commandseharusnya tidak mengandung banyak kata. Ini adalah penyebab [kesalahan yang Anda lihat. Anda harus mengatur bendera apa pun secara terpisah.

Juga, Anda harus menggunakan pytivo_useruntuk mengatur menjalankan uid, dan tidak daemon -u. Lihat halaman manual rc.subr (8) untuk semua variabel ajaib ini.

Selain itu, Anda harus memberi tahu subsistem rc bahwa pytivo adalah skrip Python sehingga dapat menemukan proses ketika memeriksa untuk melihat apakah itu berjalan.

Akhirnya, Anda harus menggunakan idiomatik set_rcvaruntuk rcvar.

Sesuatu seperti ini (saya tidak yakin ini adalah jalur Python yang benar):

#!/bin/sh

# REQUIRE: LOGIN

. /etc/rc.subr

name=pytivo
rcvar=`set_rcvar`
command=/usr/local/pytivo/pyTivo.py
command_interpreter=/usr/local/bin/python
pytivo_user=jnet
start_cmd="/usr/sbin/daemon -u $pytivo_user $command"

load_rc_config $name
run_rc_command "$1"
aecolley
sumber
Masalahnya adalah bahwa usr/local/pytivo/pyTivo.py tidak daemonize , karena itu tanpa menelepon /usr/bin/daemonsaya hanya akan mendapatkan perintah berjalan di forground ketika saya menjalankan/etc/rc.d/pytivo start
Josh
Namun ini benar statusdan stopperintah!
Josh
Oh, skrip tidak daemonize? Saya pikir perbaikan termudah adalah mengatur start_cmdsebelum memanggil load_rc_config:start_cmd="/usr/sbin/daemon -u $pytivo_user $command"
aecolley
Ini memiliki keajaiban yang saya butuhkan untuk menjalankan skrip saya. Terima kasih!
Dave Martorana
0

Jika Anda tidak memerlukan skrip rc, Anda bisa menggunakan /etc/rc.local saja.

Untuk skrip rc Anda, Anda kehilangan komentar dependenct, setidaknya satu baris

# REQUIRE: LOGIN

harus membantu, bahwa itu dijalankan pada waktu yang tepat.

Anda juga mungkin perlu mendefinisikan pidfile

pytivo_pidfile="/path/to/your/pidfile"
melengkung
sumber
Saya berharap ini akan membantu, tetapi tidak. Saya masih mendapatkan : /usr/sbin/daemon: unexpected operatordan skrip rc saya masih tidak tahu apakah skrip tersebut benar-benar berjalan.
Josh
Anda bisa mencoba untuk memohon script dengan -x untuk melihat perintah gagal
arved