2013-09-23 73 views
8

Tôi muốn thực hiện một kịch bản được tự daemonizing, ví dụ, không cần phải gọi nohup $SCRIPT &>/dev/null & bằng tay trên dấu nhắc shell.Tự daemonizing bash script

Kế hoạch của tôi là tạo ra một đoạn mã như sau:

#!/bin/bash 
SCRIPTNAME="$0" 

... 

# Preps are done above 
if [[ "$1" != "--daemonize" ]]; then 
    nohup "$SCRIPTNAME" --daemonize "${PARAMS[@]}" &>/dev/null & 
    exit $? 
fi 

# Rest of the code are the actual procedures of the daemon 

Đây có phải là khôn ngoan? Bạn có lựa chọn thay thế tốt hơn?

+1

Bạn nên sử dụng đôi báo giá khoảng '$ SCRIPTNAME' và' $ 1' ít nhất; nếu không bạn gặp rắc rối nếu có không gian trong các giá trị này. – Alfe

+0

@Alfe bạn nói đúng. Tôi quên dấu ngoặc kép. Cảm ơn bạn đã chỉ ra điều đó! – pepoluan

Trả lời

8

Dưới đây là những điều tôi thấy.

if [[ $1 != "--daemonize" ]]; then 

Shouln't rằng có == --daemonize?

nohup $SCRIPTNAME --daemonize "${PARAMS[@]}" &>/dev/null & 

Thay vì gọi kịch bản của bạn một lần nữa, bạn chỉ có thể triệu tập một subshell đó là đặt trong một nền:

(
    Codes that run in daemon mode. 
) </dev/null >/dev/null 2>&1 & 
disown 

Hoặc

function daemon_mode { 
    Codes that run in daemon mode. 
} 

daemon_mode </dev/null >/dev/null 2>&1 & 
disown 
+2

Không cần ngoặc đơn trong phiên bản trước. Chức năng sẽ được chạy trong subshell mới anyway vì &. –

+0

Ồ vâng. Tôi chỉ cần thêm tính năng 'function' vì vậy tôi đã không nhận thấy nó cảm ơn nhiều. – konsolebox

+0

Ah, cảm ơn bạn! Có vẻ tao nhã hơn nhiều. '[[" $ 1 "! = --daemonize]]' là đúng. Về cơ bản, nếu kịch bản lệnh không được gọi bằng tham số '--daemonize', nó sẽ khởi chạy lại thông số' --daemonize'. Tuy nhiên, tôi có thể thấy rằng giải pháp của bạn là thanh lịch hơn nhiều, vì vậy thử nghiệm là tranh luận. Cảm ơn bạn! – pepoluan