Tôi cần cài đặt một chương trình như một dịch vụ trong Red Hat. Nó không tự nền, quản lý tệp PID hoặc quản lý nhật ký của chính nó. Nó chỉ chạy và in ra STDOUT và STDERR.
Sử dụng các tập lệnh init tiêu chuẩn làm hướng dẫn, tôi đã phát triển như sau:
#!/bin/bash
#
# /etc/rc.d/init.d/someprog
#
# Starts the someprog daemon
#
# chkconfig: 345 80 20
# description: the someprog daemon
# processname: someprog
# config: /etc/someprog.conf
# Source function library.
. /etc/rc.d/init.d/functions
prog="someprog"
exec="/usr/local/bin/$prog"
[ -e "/etc/sysconfig/$prog" ] && . "/etc/sysconfig/$prog"
lockfile="/var/lock/subsys/$prog"
RETVAL=0
check() {
[ `id -u` = 0 ] || exit 4
test -x "$exec" || exit 5
}
start() {
check
if [ ! -f "$lockfile" ]; then
echo -n $"Starting $prog: "
daemon --user someproguser "$exec"
RETVAL=$?
[ $RETVAL -eq 0 ] && touch "$lockfile"
echo
fi
return $RETVAL
}
stop() {
check
echo -n $"Stopping $prog: "
killproc "exec"
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f "$lockfile"
echo
return $RETVAL
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status "$prog"
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|status}"
RETVAL=2
esac
exit $RETVAL
Có thể là lỗi của tôi là sao chép-dán và sửa đổi một số tập lệnh hiện có trong /etc/init.d. Trong mọi trường hợp, dịch vụ kết quả hoạt động kỳ lạ:
- Khi tôi khởi động nó
service someprog start
, chương trình sẽ in ra thiết bị đầu cuối và lệnh không hoàn thành. - nếu tôi CTRL-C, nó sẽ in "Phiên kết thúc, giết vỏ ... ... bị giết. FAILED". Tôi phải làm điều này để lấy lại dấu nhắc shell của tôi một lần nữa.
- Bây giờ khi tôi chạy
service someprog status
, nó báo nó đang chạy và liệt kê PID của nó. Tôi có thể thấy nó trongps
nên nó đang chạy. - Bây giờ khi tôi chạy
service someprog stop
nó không dừng lại. Tôi có thể xác minh rằng nó vẫn đang chạyps
.
Tôi cần thay đổi những gì để someprog
được gửi đến nền và được quản lý như một dịch vụ?
Chỉnh sửa: Bây giờ tôi đã tìm thấy một vài câu hỏi liên quan, không có câu hỏi nào trong số đó có câu trả lời thực tế ngoài "làm gì khác":
- Gọi tới daemon trong tập lệnh /etc/init.d đang chặn, không chạy trong nền
- Bắt shell script để chạy như một daemon trên CentOS?
Chỉnh sửa: câu trả lời này về cách gấp đôi có thể đã giải quyết được vấn đề của tôi, nhưng bây giờ chương trình của tôi tự thực hiện hai lần và nó hoạt động: /programming//a/9646251/898699