Kein Ctrl+c bei bash in initscript

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
reox
Beiträge: 2463
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Kein Ctrl+c bei bash in initscript

Beitrag von reox » 12.04.2016 10:36:14

Hi!
Ich hab mir ein minimal debian mit debirf zusammengebastelt, das über inittab ein script startet. In der inittab steht dann ein Eintrag wie

Code: Alles auswählen

rs:2345:once:/bin/myscript.sh
Wenn in dem Script ein fehler auftritt, starte ich eine bash, damit ich das debuggen kann. Dazu gibts eine kleine function, die dann eine Fehlermeldung ausgibt und bash startet:

Code: Alles auswählen

function failure {
echo "$1"
bash
# We want a reboot after that in any case
reboot
}
Nur scheinbar kann ich in der bash alles machen nur nicht Ctrl+C (und auch keine anderen Kombinationen wie Ctrl+D usw) drücken. Dabei wird dann ^C auf der Konsole ausgegeben.
Die einzigen traps die ich setze sind für EXIT und ERR (wobei ERR dann die failure funktion aufruft: trap 'failure "Error in line ${LINENO}"' ERR)

Was mach ich da falsch?

Benutzeravatar
Blackbox
Beiträge: 4289
Registriert: 17.09.2008 17:01:20
Lizenz eigener Beiträge: GNU Free Documentation License

Re: Kein Ctrl+c bei bash in initscript

Beitrag von Blackbox » 09.05.2016 12:50:23

Tritt ins Blaue ...
Läuft das Script vielleicht im Hintergrund, oder einer Subshell, und muss erst in den Fordergrund geholt, bzw. über die Muttershell angesprochen werden ?
Eigenbau PC: Debian Sid - Kernel: 6.5.13 - Xfce 4.18 mit sway
Desktop PC: Dell Inspiron 530 - Debian Sid - Kernel: 6.5.13 - Xfce 4.18 mit sway
Notebook: TUXEDO BU1406 - Debian Sid - Kernel: 6.5.13 - Xfce 4.18 mit sway
Alles Minimalinstallationen und ohne sudo/PA/PW.
Rootserver: Rocky Linux 9.3 - Kernel: 5.14

Freie Software unterstützen, Grundrechte stärken!

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: Kein Ctrl+c bei bash in initscript

Beitrag von NAB » 09.05.2016 15:04:24

Was erwartest du denn, was passieren soll, wenn du Ctrl+C drückst? Ich hab's bisher für völlig normal gehalten, dass dann ^C erscheint. Wär ja auch blöd, wenn die Bash sich dann beendet und ich mich damit auslogge ...
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

reox
Beiträge: 2463
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Kein Ctrl+c bei bash in initscript

Beitrag von reox » 09.05.2016 15:20:17

zB den aktuell laufenden befehl abbrechen oder mit Ctrl+D auch die aktuelle shell schließen.

NAB
Beiträge: 5501
Registriert: 06.03.2011 16:02:23
Lizenz eigener Beiträge: MIT Lizenz

Re: Kein Ctrl+c bei bash in initscript

Beitrag von NAB » 09.05.2016 15:55:13

Ach so ... laufende Befehle mit Ctrl-C abbrechen klappt auch nicht? Das ist in der Tat merkwürdig. Kann das am laufenden Befehl liegen? Dass der SIGINT abfängt? Dann könnte es helfen, den laufenden Befehl mit Ctrl+Z in den Hintergrund zu schicken und mit kill %% zu killen.

Ctrl-D macht aber auch nichts anderes als "exit". Klappt "exit" etwa auch nicht?

Und hilft es, wenn du die Bash mit "-i" (interactive) startest? (sollte eigentlich eh der Fall sein)
Never change a broken system. It could be worse afterwards.

"No computer system can be absolutely secure." Intel Document Number: 336983-001

diggerchen
Beiträge: 114
Registriert: 15.01.2005 22:35:26

Re: Kein Ctrl+c bei bash in initscript

Beitrag von diggerchen » 09.05.2016 16:58:10

Du könntest ja mal gucken, ob ^C überhaupt vom Terminal entsprechend interpretiert wird (s. intr):

Code: Alles auswählen

# stty -a
speed 38400 baud; rows 40; columns 138; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z;
rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

kuerbis
Beiträge: 20
Registriert: 29.03.2014 12:06:40

Re: Kein Ctrl+c bei bash in initscript

Beitrag von kuerbis » 10.05.2016 14:49:59

Es sollte funktionieren, wenn Du die bash folgendermaßen startest:

Code: Alles auswählen

setsid sh -c 'exec bash </dev/tty1 >/dev/tty1 2>&1'
Der Grund ist hier erklärt: https://busybox.net/FAQ.html#job_control
"There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies and the other way is to make it so complicated that there are no obvious deficiencies." (C.A.R. Hoare)

reox
Beiträge: 2463
Registriert: 06.06.2006 22:09:47
Lizenz eigener Beiträge: MIT Lizenz

Re: Kein Ctrl+c bei bash in initscript

Beitrag von reox » 11.05.2016 15:18:07

kuerbis hat geschrieben:Es sollte funktionieren, wenn Du die bash folgendermaßen startest:

Code: Alles auswählen

setsid sh -c 'exec bash </dev/tty1 >/dev/tty1 2>&1'
Der Grund ist hier erklärt: https://busybox.net/FAQ.html#job_control
Ok, das klingt sehr logisch.
Ich hab jetzt auch mal testweise systemd verwendet und dort scheint es out of the box zu gehen. Das service file schaut dann so aus:

Code: Alles auswählen

[Unit]
Description=Some Description
After=getty.target
Conflicts=getty@tty8.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/myscript.sh
StandardInput=tty-force
StandardOutput=tty
StandardError=tty
TTYVTDisallocate=yes
TTYReset=yes
TTYHangup=yes
TTYPath=/dev/tty8

[Install]
WantedBy=default.target

Antworten