blokkolós init script

Fórumok

Szervusztok!

Segítséget szeretnék kérni, egy blokkolós init script létrehozásában.

Írtam egy kicsi shell script-et, ami egy esetlegesen futó frissítésen munkálkodó apt-t figyeli, és amíg a rendszer nincs kész, addig bele áll egy hurokba.
Ezzel szeretném a rendszer-t megvédeni a kikapcsolás ellen, mert ilyen esetben a frissítés félbeszakad, ami nem szerencsés.

A kérdésem a következő volna ezzel kapcsolatban:
Miképp lehet ezt a blokkolós scrip-et úgy begyógyítani az init.d alá, hogy a halt parancs lefutását is meggátolja?

Próbáltam a függőségeket állítgatni, de valahogy nem jön össze.
Lehet hogy másképp érdemes ezt megoldani?
A segítséget köszönöm előre is!

lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 7.1 (wheezy)
Release: 7.1
Codename: wheezy

Üdv,
vfero

Hozzászólások

csak a haltot akarod meggátolni? a sbinben levő halt helyére rakj valamit, ami először meghívja a te scriptedet, utána az igazi haltot.

más: ugyanez windowson hogyan nézne ki? ha én beállítom, hogy a torrent letöltés után kapcsolja ki a számítógépet, azt hol tudnám megfogni, és beiktatni egy közbülső taskot?

Esetleg egy shutdown -c lehetne egy nem túl rossz ötlet.
De egy-két kérdés: ki és hogy szokta leállítani a gépet? Ui. ha mindig egy személy és úgy, hogy a halt parancsot adja ki, akkor esetleg egy alias-t lehetne létrehozni a halt-ra.

Vagy esetleg a /etc/apt/apt.conf.d/00exectmp fájlba:

DPkg::Pre-Invoke {"chmod -x /sbin/halt";};
DPkg::Post-Invoke {"chmod +x /sbin/halt";};

(ötlet innen)

Szervuszok!

Köszönöm az eddigi hozzászólásokat!

A gép megállítását user kezdeményezi a gnome klikkelős megállítás gombjával. Az sbin halt megoldás kicsit hekkelősnek tűnik, talán szebb egy init script.

Az init rész felé mennék tovább, de:

while [ -s $pidFile ]
do
logger "haltSleeper active"
sleep 5
done

ez a csapda csak 1x fut le, pedig a $pidFile tartalma most fix.

Nem értem miért, ha kézzel indítom, hibátlanul működik, de az init0 esetén nem áll bele, pedig függőségek beállítottam, legalább is úgy gondolom.

Így adtam hozzá:
update-rc.d haltSleeper start 99 2 3 4 5 . stop 1 0 1 6 .

illetve a K02sendsigs LSB részébe beillesztettem feltételként így:
# Required-Stop: $umountnfs haltSleeper

Mit tolok el?
Kösz,
vfero

1) En a -s teszteles helyett -e tesztelest hasznalnek
2) valoszinuleg leallitaskor az apt/dpkg mindenkepp kilovodik, mert ha jol emlekszem, a shutdown ciklus ugy indul, hogy sending TERM signal to all process. Ez elsosorban az user altal kezdemenyezett processzekre van kihatassal.

Fobb kerdesek:
- Magat a frissitest ki/mi kezdemenyezi?
- Hany kulonbozo user hasznalhat 1 gepet?
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. 

Kösz a hozzászólást!

1, ebből a szempontból ez számít valamit? Egyébként akár lehet is, de
echo -n ""
-t írok végeztével a file-ba.
2, A frissítést a cron-ból indítanám és több user (4) is használhatja a gépet.

Kösz a TERM dolgot, lehet hogy marad a /sbin/shutdown hekkelése?
vf

1) az rm biztosabb es veglegesebb...
2) en megneznem, hogy hogy all a debian packagekit integracioja. ez kepes a systrayre egy ikont kicsapni, hogy update in progress, akkor a usereket kell csak okitani h olyankor ne lojek le a gepet, csak logout. A script pedig a pkcon parancs hivasa utan nezhetne h van-e loginolt user, ha nincs es munkaido vege, shutdown. A pkcon elinditasa lesz a legnagyobb kihivas a dologban, asszem dbus-launch -csal kell felloni, hogy legyen ervenyes dbus sessionje.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. 

A jelenlegi kódom így néz ki, persze nem áll meg:


#!/bin/bash -u

### BEGIN INIT INFO
# Provides:             vfero
# Required-Start:       $remote_fs $syslog $network
# Required-Stop:        $remote_fs $syslog $networksendsig
# Default-Start:        2 3 4 5 
# Default-Stop:         0 1 6
# Short-Description:    haltSleeper
# Description:          halt sleeper, if the system is uptating
### END INIT INFO


# update-rc.d haltSleeper start 99 2 3 4 5 . stop 1 0 1 6 .

haltSleeperLoop () {
echo "haltSleeperLoop" >> $logFile
while [ -s $pidFile ]
  do
  logger "haltSleeper active"
  date >> $logFile
  sleep 10
  done
exit 0
}

trap 'haltSleeperLoop' TERM

logger "haltSleeper, 1st parameter is: " $1

case "$1" in
  start)
  ;;

  stop)
  logPath="/var/log/systemUpdate/"
  pidFile=${logPath}"systemUpdate.pid"
  startDate=`date +"%y%m%d_%H%M%S"`
  logFile=${logPath}${startDate}

  if [ -s $pidFile ]
    then
    cat $pidFile > $logFile
  fi
  haltSleeperLoop
  ;;

  *)
  echo "wrong parameter"
  exit 1
  ;;
esac

exit 0

ps.: Kár hogy a formázás nem megy át.

Elővettem ismét, persze jól fel is bosszantott. Találtam egy $all lehetőséget függőségnek, de ez sem hozza az várva várt sikert.

Szeretném a felfüggesztést/újraindítást/megállítást átmenetileg blokkolni, de nem tudom/lehet?

Nem hiszem hogy ennek nincs valami módja. Segítség!
Kösz,
vf

Ilyen célokra én a molly-guardot használom.
apt-cache show molly-guard
Package: molly-guard
...
Description: protects machines from accidental shutdowns/reboots
The package installs a shell script that overrides the existing
shutdown/reboot/halt/poweroff commands and first runs a set of scripts, which
all have to exit successfully, before molly-guard invokes the real command.
...

Persze tudom, hogy ez nem pont azt csinálja, amit akarsz, mert nem megakasztja a leállás folyamatát, hanem elindulni se engedi - de szerintem ez tisztább megoldás, mint a leállás első lépésében egy ciklusba zavarni a gépet, ami akkor lép ki, ha a frissítés lefutott. Azt is problémának érzem, hogy mi történik akkor, ha a frissítés hibára futott? Kiírta, hogy a post-install script elhasalt, az adott csomag felrakása nem sikerült - az erre épülő csomagoknál már neki se futott a konfigurálásnak a csomag kezelő. Ugyanakkor a telepítő program kilépett, tehát a leállás indulhat - ezzel elmosva a sikertelen telepítés hibaüzeneteit is. :-(
A másik, amit lássunk, hogy nem feltétlenül az ördögtől való egy eredeti script felülírása. Persze a molly-guard inkább szerver stuff, de ha a feltétel rendszert jól belövöd, azaz ellenőrizteted hogy fut-e telepítés, akkor itt is keresztbe tehet a leállásnak.

Debugold ki, mi történik! Olyan nincs, hogy a while ciklus egyszer fut le, noha a feltétel igaz marad. Azt tudom elképzelni, hogy lefut egyszer, a szülő kilép, küld egy SIGHUP-ot a gyermeknek, amely a scripted, az meg szépen belátja, hogy nem fut tuvább. Amit javaslok, hogy kapkodd el a SIGTERM, SIGINT, SIGHUP signalokat, s írd logfile-ba, ha jött valamelyik.

A másik: ha systemd-t használsz, akkor tanulmányozd a systemd-inhibit manuálját!

tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE

Megköszörültem a scrip-et, az összes releváns signal le lett fedve és nem akad fent semmi.


###############################################################################
function loggingSignal () {
echo "signal arrived: " $1
echo "signal arrived: " $1 >> $logFile
}
###############################################################################
trap 'loggingSignal "SIGHUP"'	SIGHUP	# 1
trap 'loggingSignal "SIGINT"'	SIGINT	# 2
trap 'loggingSignal "SIGQUIT"'	SIGQUIT	# 3
trap 'loggingSignal "SIGILL"'	SIGILL	# 4
trap 'loggingSignal "SIGTRAP"'	SIGTRAP	# 5
trap 'loggingSignal "SIGABRT"'	SIGABRT # 6
trap 'loggingSignal "SIGTERM"'	SIGTERM	# 15
trap 'loggingSignal "SIGSTOP"'	SIGSTOP	# 19
###############################################################################

Nem értem, nem tudom, hogy miképp lehet megfogni.

A probléma összefoglalva: A megállítást nem tudom megállítani, a regisztrált init script megindul, de félbeszakad a futása talán signal nélkül? Lehet ilyen?
Az aktuális verzióm:
http://pastebin.com/8hSRrJhU

Kösz, vfero

@vfero: hasznalj kockas code taget, illetve ha ez se jo, akkor pastebin.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. 

Azert kukacoztam, es nem replyztem, mert ha valaszt nyomok neked, az eletben tobbet nem szerkeszted a kommented. Viszont akkor, amikor irtam, nem tudtam, nem-e ir meg rajtam kivul mas is kommentet - igy ilyenkor egyertelmuve szoktam tenni, hogy kinek irok.
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant.