Wie kann ich einfach ein /etc/init.d/-Skript erstellen?

6529
Vi.

Normalerweise kopiere ich einfach ein vorhandenes Skript /etc/init.d/ssh, entferne zusätzliche Dinge und bearbeite die verbleibenden Dinge. Das ist nicht sehr bequem.

Gibt es ein einfaches Werkzeug, um gute Debian-Initscripts zu erstellen?

So etwas erwartet:

r@l:~# generate_initscript ololo \ --start-command='daemon --name ololo /usr/bin/ololo' \ --stop-command='daemon --name ololo --stop' > /etc/init.d/ololo r@l:~# cat /etc/init.d/ololo #! /bin/sh  ### BEGIN INIT INFO # Provides: ololo # Required-Start: $remote_fs $syslog # Required-Stop: $remote_fs $syslog # Default-Start: 2 3 4 5 # Default-Stop:  # Short-Description: 'ololo' script created by generate_initscript ### END INIT INFO  set -e  . /lib/lsb/init-functions  case "$1" in start) daemon --name ololo /usr/bin/ololo ;; stop) daemon --name ololo --stop ;; *) echo "Usage: /etc/init.d/ololo " exit 1 esac  exit 0 
0
Vielleicht ist MetaInit auch erwähnenswert: https://wiki.debian.org/MetaInit oder https://packages.debian.org/jessie/metainit mivk vor 8 Jahren 1

2 Antworten auf die Frage

3
MariusMatutiae

Debian und seine Derivate haben eine Datei namens skeleton im Verzeichnis /etc/init.d, die genau das tun soll, dh Benutzern dabei helfen soll, geeignete Skripts zu schreiben. Ich habe es mehrmals benutzt, es scheint mir genau das zu sein, wonach Sie suchen.

Wie erstellt man das Initscript auf Skelett-Basis, ohne den Texteditor zu verwenden? Verwenden Sie beispielsweise ein Werkzeug, das die Bearbeitung auf der Grundlage Ihrer Befehlszeilenoptionen ermöglicht. Vi. vor 10 Jahren 0
Bonuspunkte, wenn dieses Tool auch auf verschiedene Init-Systeme portierbar ist. Vi. vor 10 Jahren 0
Skripting ohne Texteditor wäre ein Trick. Haben Sie bemerkt, dass Sie "VI" heißen? Komm schon. Fopedush vor 10 Jahren 6
https://unix.stackexchange.com/a/480897/5132 `/ etc / init.d / skeleton` ist nicht mehr. JdeBP vor 5 Jahren 0
0
Vi.

Ich habe diesen gist gefunden: https://gist.github.com/naholyr/4275302

Im Grunde war es das, wonach ich gesucht habe.

Hier ist meine (modifizierte) Version des Skripts:

#!/bin/bash  SERVICE_FILE=$(tempfile)  cat >> $SERVICE_FILE <<\EOF #!/bin/sh ### BEGIN INIT INFO # Provides: <NAME> # Required-Start: $local_fs $network $named $time $syslog # Required-Stop: $local_fs $network $named $time $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Description: <DESCRIPTION> ### END INIT INFO  SCRIPT=<COMMAND> RUNAS=<USERNAME>  PIDFILE=/var/run/<NAME>.pid LOGFILE=/var/log/<NAME>.log  start() { if [ -f "$PIDFILE" ] && kill -0 $(cat "$PIDFILE"); then echo 'Service already running' >&2 return 1 fi echo 'Starting service…' >&2 local CMD="$SCRIPT &> \"$LOGFILE\" & echo \$!" su -c "$CMD" $RUNAS > "$PIDFILE" echo 'Service started' >&2 }  stop() { if [ ! -f "$PIDFILE" ] || ! kill -0 $(cat "$PIDFILE"); then echo 'Service not running' >&2 return 1 fi echo 'Stopping service…' >&2 kill -15 $(cat "$PIDFILE") && rm -f "$PIDFILE" echo 'Service stopped' >&2 }  uninstall() { echo -n "Are you really sure you want to uninstall this service? That cannot be undone. [yes|No] " local SURE read SURE if [ "$SURE" = "yes" ]; then stop rm -f "$PIDFILE" echo "Notice: log file is not be removed: '$LOGFILE'" >&2 update-rc.d -f <NAME> remove rm -fv "$0" fi }  case "$1" in start) start ;; stop) stop ;; uninstall) uninstall ;; restart) stop start ;; *) echo "Usage: $0 " esac EOF  echo "--- Customize ---" echo "I'll now ask you some information to customize script" echo "Press Ctrl+C anytime to abort." echo "Empty values are not accepted." echo ""  prompt_token() { local VAL="" while [ "$VAL" = "" ]; do echo -n "$ : " read VAL if [ "$VAL" = "" ]; then echo "Please provide a value" fi done VAL=$(printf '%q' "$VAL") eval $1=$VAL sed -i "s!<$1>!$(printf '%q' "$VAL")!g" $SERVICE_FILE }  prompt_token 'NAME' 'Service name' if [ -f "/etc/init.d/$NAME" ]; then echo "Error: service '$NAME' already exists" exit 1 fi  prompt_token 'DESCRIPTION' ' Description' prompt_token 'COMMAND' ' Command' prompt_token 'USERNAME' ' User' if ! id -u "$USERNAME" &> /dev/null; then echo "Error: user '$USERNAME' not found" exit 1 fi  echo ""  echo "--- Installation ---" if [ ! -w /etc/init.d ]; then echo "You don't gave me enough permissions to install service myself." echo "That's smart, always be really cautious with third-party shell scripts!" echo "You should now type those commands as superuser to install and run your service:" echo "" echo " mv \"$SERVICE_FILE\" \"/etc/init.d/$NAME\"" echo " touch \"/var/log/$NAME.log\" && chown \"$USERNAME\" \"/var/log/$NAME.log\"" echo " update-rc.d \"$NAME\" defaults" echo " service \"$NAME\" start" else echo "1. mv \"$SERVICE_FILE\" \"/etc/init.d/$NAME\"" mv -v "$SERVICE_FILE" "/etc/init.d/$NAME" echo "1b. chmod +x" chmod 755 "/etc/init.d/$NAME" echo "2. touch \"/var/log/$NAME.log\" && chown \"$USERNAME\" \"/var/log/$NAME.log\"" touch "/var/log/$NAME.log" && chown "$USERNAME" "/var/log/$NAME.log" echo "3. update-rc.d \"$NAME\" defaults" update-rc.d "$NAME" defaults echo "4. service \"$NAME\" start" service "$NAME" start fi  echo "" echo "---Uninstall instructions ---" echo "The service can uninstall itself:" echo " service \"$NAME\" uninstall" echo "It will simply run update-rc.d -f \"$NAME\" remove && rm -f \"/etc/init.d/$NAME\"" echo "" echo "--- Terminated ---"