Ну по за головку вы уже поняли, что в этом треде какая-то нездоровая фигня. :) К делу: иксы-то быстро стартуют, а вот виртуальные консоли прочухиваются только после того, как все демоны поднимутся. Надоело мне это, да и в огород любителям systemd надо кинуть новый булыжник. Итак. Подопытный: Арчлинукс. Место действия: несчастный комп моей девушки. Задача: запуск agetty как службы.
Собственно, сам демон (осторожно, быдлокод) /root/agettyd:
#!/bin/bash
if [ -n "$pidfile" ] ; then
echo -n $$ > "$pidfile"
fi
while true ; do
coproc setsid bash <<-XXX
exec /sbin/agetty -8 -s 38400 "$tty" linux
XXX
trap 'kill ${COPROC_PID} ; exit $?' INT TERM EXIT
wait ${COPROC_PID}
trap - INT TERM EXIT
done
Старт/стоп-скрипт /etc/rc.d/agetty:
#!/bin/bash
. /etc/rc.conf
. /etc/rc.d/functions
tty="`echo "$0" | egrep -o -- '-[a-zA-Z0-9]+$' | cut -d- -f2`"
if [[ -z "$tty" ]] ; then
tty=tty1
fi
daemonname="agetty-${tty}"
pidfile="/run/${daemonname}.pid"
if [[ -r $pidfile ]]; then
read -r PID < "$pidfile"
if [[ ! -d /proc/$PID ]]; then
# stale pidfile
unset PID
rm -f "$pidfile"
fi
fi
case "$1" in
start)
stat_busy "Starting ${daemonname}"
[ -z "$PID" ] && (
export tty
export pidfile
/root/agettyd &
) &> /dev/null < /dev/null
if [ $? -gt 0 ]; then
stat_fail
else
add_daemon lxdm
stat_done
fi
;;
stop)
stat_busy "Stopping ${daemonname}"
[ ! -z "$PID" ] && kill $PID &> /dev/null
if [ $? -gt 0 ]; then
stat_fail
else
rm_daemon lxdm
stat_done
fi
;;
restart)
$0 stop
sleep 3
$0 start
;;
*)
echo "usage: $0 {start|stop|restart}"
esac
exit 0
Симлинки:
# ls -l /etc/rc.d/agetty*
-rwxr-xr-x 1 root root 939 янв. 7 18:12 /etc/rc.d/agetty
lrwxrwxrwx 1 root root 6 янв. 7 17:34 /etc/rc.d/agetty-tty3 -> agetty
lrwxrwxrwx 1 root root 6 янв. 7 17:33 /etc/rc.d/agetty-tty4 -> agetty
lrwxrwxrwx 1 root root 6 янв. 7 17:34 /etc/rc.d/agetty-tty5 -> agetty
lrwxrwxrwx 1 root root 6 янв. 7 17:34 /etc/rc.d/agetty-tty6 -> agetty
Добавляем службы в /etc/rc.conf:
# grep DAEMONS /etc/rc.conf
# DAEMONS
DAEMONS=(syslog-ng @dbus @network @lxdm agetty-tty3 agetty-tty4 agetty-tty5 agetty-tty6 alsa @crond preload @ppp iptables @verynice dnsmasq @openntpd)
Убираем соответствующие строки из /etc/inittab:
# grep tty /etc/inittab
c1:2345:respawn:/sbin/agetty -8 -s 38400 tty1 linux
c2:2345:respawn:/sbin/agetty -8 -s 38400 tty2 linux
#c3:2345:respawn:/sbin/agetty -8 -s 38400 tty3 linux
#c4:2345:respawn:/sbin/agetty -8 -s 38400 tty4 linux
#c5:2345:respawn:/sbin/agetty -8 -s 38400 tty5 linux
#c6:2345:respawn:/sbin/agetty -8 -s 38400 tty6 linux
Первые две консоли остались в inittab. Первая понятно почему — потому что там идут стартовые логи, и agetty должен запускаться только после полной инциализации системы. Ну а вторая просто так. И в целом их не стоит оттуда убирать, потому что демоны могут быть убиты, а вот процессы, порождаемые init — штука более надежная.
Выдохнул.