추가 읽기

추가 읽기

init.d다음 스크립트( ) 가 있습니다 /etc/init.d/ctrlme.

#!/lib/init/init-d-script

### BEGIN INIT INFO
# Provides:          ctrlme
# Required-Start:    $local_fs $remote_fs $network
# Required-Stop:     $local_fs $remote_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: ctrlme
# Description:       ctrlme
### END INIT INFO

# sudo cp -v /home/gigikent/bin/init.d-services/ctrlme /etc/init.d/; sudo chown root: /etc/init.d/ctrlme
#
# https://www.pks.mpg.de/~mueller/docs/suse10.1/suselinux-manual_en/manual/sec.boot.init.html   
#

NAME=ctrlme
PIDFILE=/run/ctrlme.pid
DAEMON=/bin/bash -c '/home/gigikent/x.sh ctrlme'
DESC=ctrlme

# . /lib/lsb/init-functions
# 
# case "$1" in
#   start)
#         /home/gigikent/x.sh ctrlme
#     ;;
#   stop|restart|force-reload) 
#         exit 0
#     ;;
#   *) echo "Usage: $0 {start|stop|restart|force-reload}" >&2; exit 1 ;;
# esac

시작 실패:

Jun 16 18:57:13 gigikent.go.ro ctrlme[28454]: /lib/init/init-d-script: 20: /etc/init.d/ctrlme: -c: not found
Jun 16 18:57:13 gigikent.go.ro systemd[1]: ctrlme.service: Succeeded.
-- Subject: Unit succeeded
-- Defined-By: systemd
-- Support: http://www.ubuntu.com/support
-- 
-- The unit ctrlme.service has successfully entered the 'dead' state.

/bin/bash -c '/home/gigikent/x.sh ctrlme'명령을 실행하면 예상대로 작동합니다.
왜 이런 일이 발생하며 어떻게 해결해야 합니까?

시스템 정보:
우분투 19.04

답변1

DAEMON=/bin/bash -c '/home/adr/x.sh ctrlme'

이것은 아마도 다음과 같습니다:

데몬="/bin/bash"
DAEMON_ARGS="'/home/adr/x.sh ctrlme'"

또는 더 나은 방법은 다음과 같습니다.

데몬="/home/adr/x.sh"
DAEMON_ARGS="ctrlme"

추가 읽기

답변2

관찰된 소스를 분석합니다 /lib/init/init-d-script.

do_start_cmd() {
    start-stop-daemon --start --quiet ${PIDFILE:+--pidfile ${PIDFILE}} \
        $START_ARGS \
        --startas $DAEMON --name $NAME --exec $DAEMON --test

스크립트(예: bash 스크립트)의 경우 다음과 같이 작동하지 않습니다.http://man7.org/linux/man-pages/man8/start-stop-daemon.8.html DAEMON해야한다 pathname:

-a, --startas pathname
        With --start, start the process specified by pathname.  If not
        specified, defaults to the argument given to --exec.

위의 사용법을 의 사용법과 start-stop-daemon비교할 수도 있습니다 /lib/lsb/init-functions. 예를 들면 다음과 같습니다.

start_daemon () {
    ...
    exec="$1"; shift
    ...
    if [ "$force" ]; then
        /sbin/start-stop-daemon $args \
        --chdir "$PWD" --startas $exec --pidfile /dev/null -- "$@"
    ...

예를 들어 다음과 같이 사용하는 경우 start_daemon:

start_daemon -p /run/ctrlme.pid /bin/bash /home/adr/x.sh ctrlme

Than $execwill be /bin/bash"$@"will be /home/adr/x.sh+는 변수 와 함께 사용 하기 보다는 ctrlme사람이 없을 때 pathname사용해야 함 을 의미합니다 .start_daemon()/lib/init/init-d-scriptDAEMON

고쳐 쓰다

또한 문제와 해결책을 더 잘 강조하기 때문에 이 답변을 제공합니다. 반면에 결론의 이 부분은 잘못되었습니다.

사용할 수 없는 경우 대신 pathname사용해야 합니다. start_daemon()/lib/init/init-d-script

실제로 허용되는 답변에서 언급했듯이 DAEMONwith를 사용할 수 있습니다. 이는 2번 호출되었기 DAEMON_ARGS때문에 정확합니다 . 두 번째 호출은 다음과 같은 이점을 얻습니다 . do_start_cmd()start-stop-daemonDAEMON_ARGS

do_start_cmd() {
    start-stop-daemon --start --quiet ${PIDFILE:+--pidfile ${PIDFILE}} \
        $START_ARGS \
        --startas $DAEMON --name $NAME --exec $DAEMON --test > /dev/null \
        || return 1
    start-stop-daemon --start --quiet ${PIDFILE:+--pidfile ${PIDFILE}} \
        $START_ARGS \
        --startas $DAEMON --name $NAME --exec $DAEMON -- $DAEMON_ARGS \
        || return 2

관련 정보