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 $exec
will be /bin/bash
및 "$@"
will be /home/adr/x.sh
+는 변수 와 함께 사용 하기 보다는 ctrlme
사람이 없을 때 pathname
사용해야 함 을 의미합니다 .start_daemon()
/lib/init/init-d-script
DAEMON
고쳐 쓰다
또한 문제와 해결책을 더 잘 강조하기 때문에 이 답변을 제공합니다. 반면에 결론의 이 부분은 잘못되었습니다.
사용할 수 없는 경우 대신
pathname
사용해야 합니다.start_daemon()
/lib/init/init-d-script
실제로 허용되는 답변에서 언급했듯이 DAEMON
with를 사용할 수 있습니다. 이는 2번 호출되었기 DAEMON_ARGS
때문에 정확합니다 . 두 번째 호출은 다음과 같은 이점을 얻습니다 . do_start_cmd()
start-stop-daemon
DAEMON_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