Có cách nào dễ dàng để tạo tập lệnh RC FreeBSD không?


9

Tôi có một nhà tù FreeBSD trong đó tôi chạy một máy chủ bằng lệnh:

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

Hiện tại tôi phải chạy lệnh này mỗi lần tôi khởi động lại máy và trại giam bắt đầu. Tôi muốn có lệnh này bắt đầu từ /etc/rc. Có cách nào dễ dàng để tạo tập lệnh RC FreeBSD cho daemonlệnh không?


CẬP NHẬT: Tôi đã đọc qua tài liệu BSD này về các tập lệnh RC và từ đó tôi đã tạo tập lệnh sau trong /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"

Điều này hoạt động để bắt đầu kịch bản python mà tôi muốn làm daemon khi trại giam bắt đầu ... (đã cho pytivo_enable="YES"vào /etc/rc.conf) nhưng tập lệnh RC không biết liệu daemon có chạy hay không (nó nghĩ rằng nó không hoạt động) và nó đưa ra một cảnh báo khi tôi cố gắng khởi động nó:

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

Vì vậy, nó gần và nó hoạt động , nhưng tôi cảm thấy mình có thể có được chức năng tốt hơn thế này.


Bạn cần đặt tập lệnh này ở đâu đó (Không thể nhớ ngay bây giờ) và đặt một dòng XX_enable="YES"vào /etc/rc.conf để tự động khởi động. Bắt đầu bằng cách tìm các tập lệnh hiện có
daisy

Tôi đang tìm kiếm một cách dễ dàng để tạo tập lệnh ... Có kịch bản tốt nào tôi có thể sao chép và sử dụng lại không?
Josh

Câu trả lời:


11

commandkhông nên chứa nhiều từ. Đây là nguyên nhân của [lỗi bạn nhìn thấy. Bạn nên đặt bất kỳ cờ riêng biệt.

Ngoài ra, bạn nên sử dụng pytivo_userđể đặt uid đang chạy, và không daemon -u. Xem trang man RC.subr (8) để biết tất cả các biến ma thuật này.

Ngoài ra, bạn nên cho hệ thống con RC biết rằng pytivo là tập lệnh Python để nó có thể tìm thấy quy trình khi kiểm tra xem nó có chạy hay không.

Cuối cùng, bạn nên sử dụng thành ngữ set_rcvarcho rcvar.

Một cái gì đó như thế này (Tôi không chắc đây là đường dẫn Python đúng):

#!/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"

Vấn đề là usr/local/pytivo/pyTivo.py không tạo daemonize , do đó, không gọi /usr/bin/daemontôi sẽ chỉ nhận lệnh chạy trong forground khi tôi chạy/etc/rc.d/pytivo start
Josh

Tuy nhiên, điều này không chính xác statusstopcác lệnh!
Josh

Oh, kịch bản không daemonize? Tôi nghĩ cách khắc phục dễ nhất là đặt start_cmdtrước khi gọi load_rc_config:start_cmd="/usr/sbin/daemon -u $pytivo_user $command"
aeccar

Điều này có phép thuật tôi cần để chạy kịch bản của tôi. Cảm ơn!
Dave Martorana

0

Nếu bạn không cần một tập lệnh RC, bạn có thể sử dụng chỉ /etc/rc.local.

Đối với tập lệnh RC của bạn, bạn đang thiếu các bình luận phụ thuộc, ít nhất là một dòng

# REQUIRE: LOGIN

nên giúp đỡ, rằng nó được chạy đúng lúc

Bạn cũng có thể cần xác định một pidfile

pytivo_pidfile="/path/to/your/pidfile"

Tôi đã hy vọng điều này sẽ giúp, nhưng nó không. Tôi vẫn nhận được : /usr/sbin/daemon: unexpected operatorvà tập lệnh RC của tôi vẫn không biết liệu tập lệnh có thực sự chạy hay không.
Josh

bạn có thể thử gọi tập lệnh bằng -x để xem lệnh nào thất bại
bắt đầu
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.