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
- 12003 megtekintés
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.
- A hozzászóláshoz be kell jelentkezni
Jó ötlet, a gnome felülete is az sbin halt ill. shutdown, reboot -ot hívogatja vajon?
Kösz!
vfero
- A hozzászóláshoz be kell jelentkezni
Ki kell próbálni.
- A hozzászóláshoz be kell jelentkezni
gnome: shutdown -r
- A hozzászóláshoz be kell jelentkezni
Ami aztán csomagfrissítéskor felülíródik/rejtélyes hiba íródik ki.
- A hozzászóláshoz be kell jelentkezni
Erre valo a dpkg-divert, nyilvan ilyesmit hasznal az ember ha /sbin alatt mokol.
--
|8]
- A hozzászóláshoz be kell jelentkezni
Áhh, ezt se ismertem (mentségemre legyen szólva, az utolsó dpkg-szerű rendszer, amit használtam, az uhu 1.1.1-es volt).
- A hozzászóláshoz be kell jelentkezni
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?
- A hozzászóláshoz be kell jelentkezni
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)
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
nagyon zűrös amit összeszedtem?
Kösz,
vf
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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 hozzászóláshoz be kell jelentkezni
enélkül nem fut le az initscripted vagy nem várja meg az init míg lefut és kikapcsol?
# Required-Stop: $umountnfs haltSleeper
- A hozzászóláshoz be kell jelentkezni
Az én scrit-em lefut, de a while loop csak egy alakalommal, pedig a feltétel alapján itt kellene megállnia. A következő meg gondolom ez miatt megy tovább. Megpróbálom elkapni a TERM signal-t, és jól ignorálni, a megoldásom majd publikálom.
Üdv,
vf
- A hozzászóláshoz be kell jelentkezni
subscribe
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni
A telepítést frissítést logolni érdemes file-ba, abból baj nem lehet. ;)
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
A frissítés menete persze keményen naplózva, a sikertelen kimenetről fogok tudni. ;) Sikertelen frissítés után következőre nem is fog elindulni, mert kézi beavatkozásra van szükség. Kösz azért!
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
+1 az inhibitert
--
A legértékesebb idő a pillanat amelyben élsz.
https://sites.google.com/site/jupiter2005ster/
- A hozzászóláshoz be kell jelentkezni
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
- A hozzászóláshoz be kell jelentkezni
SIGCONT-18 érkezik. Elkapom, de a függőséggel még lehet valami, mert ||-an kivágja alóla a fát. :S
- A hozzászóláshoz be kell jelentkezni
Ha minden signalt elkapsz, szerintem nem tud mit csinálni, csak nem küld SIGKILL-t, mert az gonosz lenne.
tr '[:lower:]' '[:upper:]' <<<locsemege
LOCSEMEGE
- A hozzászóláshoz be kell jelentkezni
Én is ezt reméltem de nem. Jön gondolom a "9" de ennek még utána nézek...
http://pastebin.com/yLfn8Sjn
- A hozzászóláshoz be kell jelentkezni
@vfero: hasznalj kockas code taget, illetve ha ez se jo, akkor pastebin.
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant.
- A hozzászóláshoz be kell jelentkezni
@hrgy84: Kösz, így sokkal jobb lett!
- A hozzászóláshoz be kell jelentkezni
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.
- A hozzászóláshoz be kell jelentkezni