Du bist nicht angemeldet.
Seiten: 1
grüß euch
es geht um folgende zwei methoden, die so nicht funktionieren,
eine tty wird erstellt, die anderen nicht, dafür kommen 4 fehler meldungen.
def start(id, cmd)
pid = fork do
Process.setsid()
exec(*cmd)
end
$daemons[id] = pid
end
if $emergency
start('agetty1', %w[agetty tty1 --noclear --autologin root])
else
(1..5).each do |n|
start("agetty#{n}", %W[agetty tty#{n}])
end
die zweite methode ruft 5 mal die erste methode auf, damit 5 tty erstellt werden.
n sollte hoch zählen so wie ich das sehe aber das funktioniert nicht so.
leider hab ich von ruby keine ahnung und kate zeigt mir das n in "agetty#{n}" anders farbig an, als jenes in %W[agetty tty#{n}],
daher geh ich davon aus, daß das zweite n nicht als variable betrachtet wird…
wie kann ich das zweite n zu einer variable machen?
die methoden kommen a her https://github.com/felipec/finit
https://felipec.wordpress.com/2013/11/04/init/
Beitrag geändert von brikler (16.04.2018 09:25:13)
Offline
es geht um folgende zwei methoden, die so nicht funktionieren,
Der relevante Codeteil ist funktionabel, man kann es so testen:
#!/usr/bin/env ruby
#
def start(id, cmd)
#p id, cmd
pid = fork do
Process.setsid()
exec(*cmd)
end
puts "Pid: #{pid}"
end
(3..5).each do |n|
start("agetty#{n}", %W[agetty tty#{n}])
#start("xterm#{n}", %W[term -rv -hold -e echo tty#{n}])
end
Beim auskommentierten(#) Test mit den xterms habe ich 5 xterms (1..5) gestartet, du kannst so auch sehen (echo) daß die von dir befürchtete Variable doch korrekt "hochzählt".
Beim aktuellen mit den gettys habe ich nur 3..5 gestartet - daß muß logischerweise als root erfolgen! - da andere durch die systemd-getty-services belegt waren. Aber auch das funktioniert hier:
[root@ws01 tmp]# ps ax|grep getty
1716 tty2 Ss+ 0:00 /sbin/agetty -o -p -- \u --noclear tty2 linux
1812 tty6 Ss+ 0:00 /sbin/agetty -o -p -- \u --noclear tty6 linux
1882 pts/1 S+ 0:00 grep getty
[root@ws01 tmp]# ruby -w fork_test.rb
Pid: 1885
Pid: 1888
Pid: 1891
[root@ws01 tmp]# ps ax|grep getty
1716 tty2 Ss+ 0:00 /sbin/agetty -o -p -- \u --noclear tty2 linux
1812 tty6 Ss+ 0:00 /sbin/agetty -o -p -- \u --noclear tty6 linux
1885 tty3 Ss+ 0:00 agetty tty3
1888 tty4 Ss+ 0:00 agetty tty4
1891 tty5 Ss+ 0:00 agetty tty5
1895 pts/1 S+ 0:00 grep getty
Und die gettys auf 3,4,5 laufen.
eine tty wird erstellt, die anderen nicht, dafür kommen 4 fehler meldungen.
Vielleicht könnten diese hilfreich sein?
Offline
da ist was faul im staate dänemark
bei mir kommt dies heraus
[tom@donar ~]$ ps -ax | grep getty
490 pts/0 S+ 0:00 grep --color=tty -d skip getty
das "%W[agetty tty#{n}]" wird bei mir wie ein string behandelt…
[tom@donar ~]$ cat ./getty
#!/usr/bin/env ruby
#
def start(id, cmd)
#p id, cmd
pid = fork do
Process.setsid()
exec(*cmd)
end
puts "Pid: #{pid}"
end
(3..5).each do |n|
start("agetty#{n}", %W[agetty tty#{n}])
#start("xterm#{n}", %W[term -rv -hold -e echo tty#{n}])
end
[tom@donar ~]$ ./getty
Pid: 943
Pid: 946
Pid: 949
[tom@donar ~]$ ps -ax | grep getty
953 pts/1 S+ 0:00 grep --color=tty -d skip getty
wenn ich dein code schnippsel mit xterm versuche kommt das dabei raus:
[tom@donar ~]$ ./getty
Pid: 803
./getty:7:in `exec': No such file or directory - term (Errno::ENOENT)
from ./getty:7:in `block in start'
from ./getty:5:in `fork'
from ./getty:5:in `start'
from ./getty:14:in `block in <main>'
from ./getty:12:in `each'
from ./getty:12:in `<main>'
./getty:7:in `exec': No such file or directory - term (Errno::ENOENT)
from ./getty:7:in `block in start'
from ./getty:5:in `fork'
from ./getty:5:in `start'
from ./getty:14:in `block in <main>'
from ./getty:12:in `each'
from ./getty:12:in `<main>'
Pid: 806
Pid: 811
./getty:7:in `exec': No such file or directory - term (Errno::ENOENT)
from ./getty:7:in `block in start'
from ./getty:5:in `fork'
from ./getty:5:in `start'
from ./getty:14:in `block in <main>'
from ./getty:12:in `each'
from ./getty:12:in `<main>'
Beitrag geändert von brikler (16.04.2018 13:52:45)
Offline
bei mir kommt dies heraus
[tom@donar ~]$ ps -ax | grep getty 490 pts/0 S+ 0:00 grep --color=tty -d skip getty
sagt nur, daß du keinen Prozeß mit getty im Namen am Laufen hast.
das "%W[agetty tty#{n}]" wird bei mir wie ein string behandelt…
Glaube ich nicht, und ist auch nicht ersichtlich.
%W[] bildet ein Array aus Strings, ausgerichtet an den Wortgrenzen. Ist eine Form, um nicht laufend mit Stringverkettungen arbeiten zu müssen (bessere Lesbarkeit). Bei groß W werden Variablen aufgelöst (hier#{n} zur Zahl), blei kleinem W wird jeder Text genommen wie er steht.
[tom@donar ~]$ cat ./getty #!/usr/bin/env ruby # def start(id, cmd) #p id, cmd pid = fork do Process.setsid() exec(*cmd) end puts "Pid: #{pid}" end (3..5).each do |n| start("agetty#{n}", %W[agetty tty#{n}]) #start("xterm#{n}", %W[term -rv -hold -e echo tty#{n}]) end [tom@donar ~]$ ./getty Pid: 943 Pid: 946 Pid: 949 [tom@donar ~]$ ps -ax | grep getty 953 pts/1 S+ 0:00 grep --color=tty -d skip getty
Immerhin werden 3 Prozesse gestartet, dein problem dürfte sein, daß gettys nur von root gestartet werden dürfen auf den /dev/ttyX. Dein Prompt läßt vermuten, daß du das als User startest.
wenn ich dein code schnippsel mit xterm versuche kommt das dabei raus:
[tom@donar ~]$ ./getty Pid: 803 ./getty:7:in `exec': No such file or directory - term (Errno::ENOENT) ...
Sorry, da hatte ich wohl rumeditiert ohne das xterm nochmal ausprobiert zu haben.
Startt term muß natürlich auch xterm gestartet werden. Die Zeile muß also lauten:
#start("xterm#{n}", %W[xterm -rv -hold -e echo tty#{n}])
Offline
. Dein Prompt läßt vermuten, daß du das als User startest.
das schnippsel hab ich so gestartet und mit sudo funktioniert es, also stimmt die hervorhebung von kate nicht.
auch wenn das schnippsel "so" funktioniert, im ursprungskontext tut es das nicht, bzw versteh ich nicht recht warums da nicht funktioniert.
es ist ein init, zb wird alles einwandfrei gemountet und dann "darf" ich die getty nicht starten?
#!/usr/bin/ruby
require 'socket'
def do_cmd(*cmd)
ctl = UNIXSocket.open('/run/initctl')
ctl.puts(cmd.join(' '))
puts(ctl.readline.chomp)
exit
end
if $$ != 1
case ARGV[0]
when 'poweroff', 'restart', 'halt'
do_cmd(ARGV[0].to_sym)
when 'status'
do_cmd(ARGV.shift.to_sym, *ARGV)
when 'test'
map = { poweroff: 0x4321fedc, restart: 0x01234567, halt: 0xcdef0123 }
syscall(169, 0xfee1dead, 537993216, map[:poweroff])
else
exit 1
end
end
$daemons = {}
Signal.trap(:SIGCHLD) do
loop do
begin
status = Process.wait(-1, Process::WNOHANG)
key = $daemons.key(status)
$daemons.delete(key) if key
break if status == nil
rescue Errno::ECHILD
break
end
end
end
def action(name)
print(name)
begin
yield
rescue => e
print(' (error: %s)' % e)
end
puts
end
NETFS = %w[nfs nfs4 smbfs cifs codafs ncpfs shfs fuse fuseblk glusterfs davfs fuse.glusterfs]
VIRTFS = %w[proc sysfs tmpfs devtmpfs devpts]
def init
def is_mounted(path)
return false unless File.directory?(path)
path = File.realpath(path)
a = File.stat(path)
b = File.stat(path + '/..')
return (a.dev != b.dev) || (a.ino == b.ino)
end
def mount(type, device, dir, opts)
return if is_mounted(dir)
Dir.mkdir(dir) unless File.directory?(dir)
system('mount', '-t', type, device, dir, '-o', opts)
end
action 'Mounting virtual file-systems' do
mount('proc', 'proc', '/proc', 'nosuid,noexec,nodev')
mount('sysfs', 'sys', '/sys', 'nosuid,noexec,nodev')
mount('tmpfs', 'run', '/run', 'mode=0755,nosuid,nodev')
mount('devtmpfs', 'dev', '/dev', 'mode=0755,nosuid')
mount('devpts', 'devpts', '/dev/pts', 'mode=0620,gid=5,nosuid,noexec')
mount('tmpfs', 'shm', '/dev/shm', 'mode=1777,nosuid,nodev')
end
action 'Setting hostname' do
hostname = File.read('/etc/hostname').chomp
File.write('/proc/sys/kernel/hostname', hostname)
end
action 'Starting udev daemon' do
system('/usr/lib/systemd/systemd-udevd', '--daemon')
end
action 'Triggering udev uevents' do
system('udevadm', 'trigger', '--action=add', '--type=subsystems')
system('udevadm', 'trigger', '--action=add', '--type=devices')
end
action 'Waiting for udev uevents to be processed' do
system('udevadm', 'settle')
end
if not File.directory?('/sys/class/net/lo')
action 'Bringing up loopback interface' do
system('ip', 'link', 'set', 'up', 'dev', 'lo')
end
end
action 'Mounting local filesystems' do
except = NETFS.map { |e| 'no' + e }.join(',')
system('mount', '-a', '-t', except, '-O', 'no_netdev')
end
action 'Manage temporary files' do
system('systemd-tmpfiles', '--create', '--remove', '--clean')
end
end
def shutdown
def killall
def allgone?()
Dir.glob('/proc/*').each do |e|
pid = File.basename(e).to_i
begin
next if pid < 2
# Is it a kernel process?
next if File.read('/proc/%i/cmdline' % pid).empty?
rescue Errno::ENOENT
end
return false
end
return true
end
def wait_until(timeout = 2, interval = 0.25)
start = Time.now
begin
break true if yield
sleep(interval)
end while (Time.now - start) < timeout
end
ok = false
action 'Sending SIGTERM to processes' do
Process.kill(:SIGTERM, -1)
ok = wait_until(10) { allgone? }
raise 'Failed' unless ok
end
return if ok
action 'Sending SIGKILL to processes' do
Process.kill(:SIGKILL, -1)
ok = wait_until(15) { allgone? }
raise 'Failed' unless ok
end
end
action 'Shutting down udev' do
system('udevadm', 'control', '--exit')
end
# Kill everything
killall
action 'Unmounting real filesystems' do
except = (NETFS + VIRTFS).map { |e| 'no' + e }.join(',')
system('umount', '-a', '-t', except, '-O', 'no_netdev')
end
sys_sync()
end
init
begin
File.delete('/run/nologin')
rescue Errno::ENOENT
end
ARGV.each do |e|
case e
when 'emergency'
$emergency = true
end
end
def start(id, cmd)
pid = fork do
Process.setsid()
exec(*cmd)
end
$daemons[id] = pid
end
if $emergency
start('agetty1', %w[agetty tty1 --noclear --autologin root])
else
(1..5).each do |n|
start("agetty#{n}", %W[agetty tty#{n}])
end
start('slim', %w[slim -nodaemon])
Dir.mkdir('/run/dbus', 0755) unless File.exists?('/run/dbus')
start('dbus', %w[dbus-daemon --system --nofork --nopidfile])
end
def sys_reboot(cmd)
map = { poweroff: 0x4321fedc, restart: 0x01234567, halt: 0xcdef0123 }
syscall(169, 0xfee1dead, 537993216, map[cmd])
end
def sys_sync
syscall(162)
end
begin
server = UNIXServer.open('/run/initctl')
rescue Errno::EADDRINUSE
File.delete('/run/initctl')
retry
end
loop do
ctl = server.accept
args = ctl.readline.chomp.split
cmd = args.shift.to_sym
case cmd
when :poweroff, :restart, :halt
shutdown
sys_reboot(cmd)
when :status
ctl.puts($daemons[args.first] ? 'ok' : 'dead')
end
end
quelle ist im ersten post verlinkt.
Offline
GerBra schrieb:. Dein Prompt läßt vermuten, daß du das als User startest.
das schnippsel hab ich so gestartet und mit sudo funktioniert es, also stimmt die hervorhebung von kate nicht.
Den Zusammenhang mit kate verstehe ich jetzt überhaupt nicht, aber das ein Editor einen String in der Syntaxhervorhebung anders darstellt als ein Array erscheint mir OK:
start("agetty#{n}", %W[agetty tty#{n}])
"agetty#{n}" ist ein String (Inhalt: "agetty1")
%W[agetty tty#{n}] bildet ein Array aus Strings (Inhalt: ["agetty", "tty1"]
es ist ein init, zb wird alles einwandfrei gemountet und dann "darf" ich die getty nicht starten?
Ich hab mir das nur grob angeschaut, geschweige von Tests:
In welchem Kontext, wann, startest Du das denn? Als init mit der PID1 (Ersatz für systemd pid1)?
Klappt der emercency "Runlevel"?
Sind alle lokalen Dateisysteme gemountet (/var z.B.). Ich sehe z.B. keinen fstab-Teil im Skript.
Gibt es in den Logfiles Meldungen zum agetty-Startversuch (sofern du Sys-Logging hast)?
Sonstige Fehlermeldungen auf den Konsolen?
Zu den gettys speziell:
Nur ein Getty laufen zu haben reicht natürlich nicht, da es quasi erstmal nichts anderes als ein "aufgebohrter" Fernschreiber ist (also stdin, stdout verarbeiten).
Gibt es zu dem Zeitpunkt /var/run/utmp ?
Gibt es ein /bin/login (normalerweise systemd-Sache)?
Du könntest testweise den agetty-Aufruf etwas spezifizieren:
(1..5).each do |n|
start("agetty#{n}", %W[/sbin/agetty -o -p -- \\u --noclear tty#{n} linux])
end
Offline
ich muß etwas ausführlicher sein: ich las den blog beitrag und am ende dacht ich mir "probiers, kost ja nichts", also hab ichs runter geladen, hab "slim" gegen "sddm" getauscht, neu gestartet und am ende hatte ich einen funktionierenden desktop, mit ein paar warnings und die fehlermeldungen für die tty.
ich geb das init direkt in der grub shell an init= und wahrscheinlich bin ich in der emergency shell…wie lässt sich das herausfinden?
die fehlermeldung sind weg seit ich dieses einfügte
(1..5).each do |n|
start("agetty#{n}", %W[/sbin/agetty -o -p -- \\u --noclear tty#{n} linux])
end
aber ich hab nach wie vor die warnings auf tty1, soweit ich mich erinnere von consolekit und upower.
der desktop ist auf tty7, dazwischen gibts nichts.
[tom@donar ~]$ ps -ax | grep agetty
765 pts/0 S+ 0:00 grep --color=tty -d skip agetty
es ist alles eingebunden wie ich es erwarte
[tom@donar ~]$ cat /proc/self/mounts
proc /proc proc rw,nosuid,nodev,noexec,relatime 0 0
sys /sys sysfs rw,nosuid,nodev,noexec,relatime 0 0
dev /dev devtmpfs rw,nosuid,relatime,size=1512512k,nr_inodes=378128,mode=755 0 0
run /run tmpfs rw,nosuid,nodev,relatime,mode=755 0 0
/dev/sda2 / f2fs rw,lazytime,relatime,background_gc=on,no_heap,user_xattr,inline_xattr,acl,inline_data,inline_dentry,flush_merge,extent_cache,mode=adaptive,active_logs=6 0 0
devpts /dev/pts devpts rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
shm /dev/shm tmpfs rw,nosuid,nodev,relatime 0 0
/dev/sda3 /home f2fs rw,lazytime,noatime,background_gc=on,no_heap,user_xattr,inline_xattr,acl,inline_data,inline_dentry,flush_merge,extent_cache,mode=adaptive,active_logs=6 0 0
tmpfs /tmp tmpfs rw,noatime 0 0
tmpfs /var/log tmpfs rw,noatime,mode=2755 0 0
none /run/user/1000 tmpfs rw,relatime,mode=700,uid=1000 0 0
utmp gibts nicht und auch keine log…
[root@ws01 tmp]# ps ax|grep getty 1716 tty2 Ss+ 0:00 /sbin/agetty -o -p -- \u --noclear tty2 linux 1812 tty6 Ss+ 0:00 /sbin/agetty -o -p -- \u --noclear tty6 linux 1885 tty3 Ss+ 0:00 agetty tty3 1888 tty4 Ss+ 0:00 agetty tty4 1891 tty5 Ss+ 0:00 agetty tty5 1895 pts/1 S+ 0:00 grep getty
Und die gettys auf 3,4,5 laufen.
bei mir laufen sie nicht, ich habs nachträglich laufen lassen
[tom@donar ~]$ ps -ax | grep getty
513 ? Ss 0:00 /sbin/agetty -o -p -- \u --noclear tty1 linux
516 ? Ss 0:00 /sbin/agetty -o -p -- \u --noclear tty2 linux
519 ? Ss 0:00 /sbin/agetty -o -p -- \u --noclear tty3 linux
522 ? Ss 0:00 /sbin/agetty -o -p -- \u --noclear tty4 linux
525 ? Ss 0:00 /sbin/agetty -o -p -- \u --noclear tty5 linux
529 pts/0 S+ 0:00 grep --color=tty -d skip getty
der zweite string wird bei mir nicht gebildet
Beitrag geändert von brikler (17.04.2018 15:16:14)
Offline
die fehlermeldung sind weg seit ich dieses einfügte
(1..5).each do |n| start("agetty#{n}", %W[/sbin/agetty -o -p -- \\u --noclear tty#{n} linux]) end
aber ich hab nach wie vor die warnings auf tty1, soweit ich mich erinnere von consolekit und upower.
der desktop ist auf tty7, dazwischen gibts nichts.
Ich habe den geänderten Codeteil gerade nochmal in dem isolierten Skript aus Post#2 getestet, und da funktioniert etwas nicht, d.h. diese Startart/parameter binden die gettys nicht richtig an die jeweiligen ttyX-Devices. Ändere das mal entweder wieder zurück oder zumindest zu:
start("agetty#{n}", %W[/sbin/agetty tty#{n} linux])
Mein ursprünglicher Gedanke war, daß entweder mangels Pfad zu dem Zeitpunkt "agetty" schlicht nicht gefunden wird (deshalb explizite Pfadangabe) oder die Terminalemulation nicht bestimmt werden kann (deshalb explizit linux).
Die von dir schon oft angeführten Fehlermeldungen, Warnings dürften dann wieder auftauchen, die exakten Meldungen wären dann schon mal interessant, hilfreich.
Ich habe ad hoc keine Möglichkeit, daß als reales init auszutesten, allerdings würde ich dazu eine virtuelle Maschine nutzen, daß würde das Debuggen bei gleichzeitigem normalen Arbeiten einfacher machen.
utmp gibts nicht und auch keine log…
Ob /var/run/utmp zu Start bzw. Nichtstart von agetty wirklich notwendig ist entzieht sich meiner Kenntniss. Ist /bin/login vorhanden? Da du ja seit geraumer Zeit mit systemd und Alternativen experimentierst weiß ich nicht, was davon bzw. an Alternativen noch vorhanden ist.
In dmesg wird auch nichts geloggt?
Offline
so ernst ist die sache nicht, minirc war die letzen tage mein haupt init und zu diesem skript verleitete mich die pure neugierde
im augenblick ist das system systemd frei und utmp sollte eigentlich unnötig sein
The utmp file allows one to discover information about who is currently using the system. There may be more users currently using the system, because not all programs use utmp logging.
/usr/bin/login existiert
[tom@donar ~]$ pacman -Qo /usr/bin/login
/usr/bin/login ist in util-linux 2.31-4 enthalten
da stimmt was anderes nicht, gut möglich, daß das blos mein system betrifft…ich hab bissl was geändert
#!/usr/bin/env ruby
#
def start(id, cmd)
#p id, cmd
pid = fork do
Process.setsid()
exec(*cmd)
end
puts "Pid: #{pid}"
end
start("agetty1", %W[/sbin/agetty -o -p -- \\u --noclear ttyA linux])
start("agetty2", %W[/sbin/agetty -o -p -- \\u --noclear ttyB linux])
start("agetty3", %W[/sbin/agetty -o -p -- \\u --noclear ttyC linux])
das kommt dabei raus…
[tom@donar ~]$ ps -ax | grep getty
807 ? Ss 0:00 /sbin/agetty -o -p -- \u --noclear ttyA linux
810 ? Ss 0:00 /sbin/agetty -o -p -- \u --noclear ttyB linux
813 ? Ss 0:00 /sbin/agetty -o -p -- \u --noclear ttyC linux
817 pts/1 S+ 0:00 grep --color=tty -d skip getty
ich werd gleich mal in dmesg schaun
edit
dmesg liefert die ganz normale ausgabe
edit2
Process.setsid(), das funktioniert nicht… wie kann ich das ergebnis von Process.setsid() ausgeben lassen?
Beitrag geändert von brikler (17.04.2018 17:08:10)
Offline
so ernst ist die sache nicht
Das sehe ich mittlerweile auch so...
da stimmt was anderes nicht, gut möglich, daß das blos mein system betrifft…ich hab bissl was geändert
start("agetty1", %W[/sbin/agetty -o -p -- \\u --noclear ttyA linux]) start("agetty2", %W[/sbin/agetty -o -p -- \\u --noclear ttyB linux]) start("agetty3", %W[/sbin/agetty -o -p -- \\u --noclear ttyC linux])
das kommt dabei raus…
[tom@donar ~]$ ps -ax | grep getty 807 ? Ss 0:00 /sbin/agetty -o -p -- \u --noclear ttyA linux 810 ? Ss 0:00 /sbin/agetty -o -p -- \u --noclear ttyB linux 813 ? Ss 0:00 /sbin/agetty -o -p -- \u --noclear ttyC linux 817 pts/1 S+ 0:00 grep --color=tty -d skip getty
Genau was ich erwartet hätte ;-)
Wahrscheinlich hast du auch einen eigenen Kernel, der ganz andere Devicebezeichner hat als wir "Normalsterblichen" <g>. Vielleicht noch die restlichen Buchstaben im Alphabet durchprobieren? Oder die manpage zu agetty konsultieren, was die möglichen Optionen bedeuten?
ich werd gleich mal in dmesg schaun
edit
dmesg liefert die ganz normale ausgabe
edit2
Process.setsid(), das funktioniert nicht… wie kann ich das ergebnis von Process.setsid() ausgeben lassen?
Wenn dmesg alles normal anzeigt dann ist ja auch alles OK,
aber Oh: Du hast natürlich schon wieder was Neues entdeckt, was dich schier ausbremst. Jetzt hast du was Neues als den Übeltäter ausgemacht, natürlich ohne nachvollziebaren Nachweis. Jeder angefragte Nachweis für deine diversen Schuldigen bleibst du schuldig.
Macht IMHO wenig Sinn...
Offline
Genau was ich erwartet hätte ;-)
Wahrscheinlich hast du auch einen eigenen Kernel, der ganz andere Devicebezeichner hat als wir "Normalsterblichen" <g>.
ein eigener kernel wär eine nette herausforderung
programmier "fehler" suchen, in einer sprache die man nicht kennt, ist wie im trüben fischen…es schaut erst mal alles nach beute aus.
langsam klärt sichs für mich, es wird (k)ein sauber string gebildet und übergeben,
start("agetty1", %W[/sbin/agetty -o -p -- \\u --noclear tty1 linux])
start("agetty2", %W[/sbin/agetty -o -p -- \\u --noclear tty2 linux])
start("agetty3", %W[/sbin/agetty -o -p -- \\u --noclear tty3 linux
das kommt dabei raus, so wies erwartet wird:
[tom@donar ~]$ ps -ax | grep getty
246 tty2 Ss+ 0:00 /sbin/agetty -8 -s 38400 tty2 linux
247 tty3 Ss+ 0:00 /sbin/agetty -8 -s 38400 tty3 linux
249 tty4 Ss+ 0:00 /sbin/agetty -8 -s 38400 tty4 linux
750 pts/0 Sl+ 0:01 kate getty
774 pts/1 S+ 0:00 grep --color=tty -d skip getty
Beitrag geändert von brikler (17.04.2018 19:58:35)
Offline
programmier "fehler" suchen, in einer sprache die man nicht kennt, ist wie im trüben fischen…es schaut erst mal alles nach beute aus.
für mich sieht die sache erst mal klar aus, es wird (k)ein saubere strings übergeben,start("agetty1", %W[/sbin/agetty -o -p -- \\u --noclear ttyA linux])
Ich hatte in Post#8 geschrieben, daß diese erweiterte Notation so in Ruby nicht das Gewünschte liefert, und Alternativen aufgezeigt. Diese ignoriest Du.
Du kannst nicht einfach tty#{n} gegen irgendwas austauschen. Diese Option von agetty bezieht sich auf die Devicebezeichner der TTY-Terminals, /dev/tty1, tty2 usw. "Irgendwas" anderes zu verwenden ist, wie im gesamten Skript mal alle "a" zu "ö" zu ändern - könnte ja funktionieren....
Weiterhin bleibst du alle nachgefragten Rückmeldung(Fehlermeldung, Warnungen, usw.), anhand derer wir anderen ggf. das ganze nachvollziehen können was du als "Fehler" siehst, schuldig. Du lieferst nur "Interpretationen". Das ist keine Grundlage.
Offline
Nur kurz zu deiner Information:
a) frisches Archlinux in einer virtualbox Installation
# wget https://github.com/felipec/finit/archive.master.zip
# unzip master.zip
# cp finit-master/init /usr/local/bin/
Reboot, im Bootloader ein init=/usr/local/bin/init anhängen.
System bootet einwandfrei, alle gettys funktionieren, keinerlei ersichtliche Fehler, Log-Daemon gibt es keinen, mit /usr/local/bin/init poweroff läßt sich das System sauber herunterfahren.
Offline
auf dem einen laptop funktioniert es einwand frei, auf dem systemd freien, funktionierts nicht.
laptop1 mit systemd:
frija ~]$ cat testloop
#!/usr/bin/env ruby
#
def start(id, cmd)
#p id, cmd
pid = fork do
Process.setsid()
exec(*cmd)
end
puts "Pid: #{pid}"
end
(3..5).each do |n|
start("agetty#{n}", %W[agetty tty#{n}])
#start("xterm#{n}", %W[term -rv -hold -e echo tty#{n}])
end
[tom@frija ~]$ ps -ax | grep tty
370 tty7 Ssl+ 0:00 /usr/lib/xorg-server/Xorg -nolisten tcp -auth /var/run/sddm/{0acf5d65-1077-4e50-9902-9f28863d08d8} -background none -noreset -displayfd 19 -seat seat0 vt7
731 tty3 Ss+ 0:00 agetty tty3
734 tty4 Ss+ 0:00 agetty tty4
737 tty5 Ss+ 0:00 agetty tty5
745 pts/0 S+ 0:00 grep --color=tty -d skip tty
laptop2 systemd frei:
[tom@donar ~]$ cat getty
#!/usr/bin/env ruby
#
def start(id, cmd)
#p id, cmd
pid = fork do
Process.setsid()
exec(*cmd)
end
puts "Pid: #{pid}"
end
(3..5).each do |n|
start("agetty#{n}", %W[agetty tty#{n}])
#start("xterm#{n}", %W[term -rv -hold -e echo tty#{n}])
end
[tom@donar ~]$ ps -ax | grep getty
252 tty2 Ss+ 0:00 /sbin/agetty -8 -s 38400 tty2 linux
258 ? Ss 0:00 /sbin/agetty -8 -s 38400 tty3 linux
263 ? Ss 0:00 /sbin/agetty -8 -s 38400 tty4 linux
917 ? Ss 0:00 agetty tty3
920 ? Ss 0:00 agetty tty4
923 ? Ss 0:00 agetty tty5
1404 tty3 Ss+ 0:00 agetty tty3
1407 tty4 Ss+ 0:00 agetty tty4
1410 tty5 Ss+ 0:00 agetty tty5
1429 pts/1 S+ 0:00 grep --color=tty -d skip getty
in dem fall hab ichs mit minirc gestartet, aber das sollt keinen unterschied machen.
ich hab das unveränderte schnippsel zwei mal laufen lassen, mit zwei verschiedenen ergebnisse…
es liegt leider am system
Beitrag geändert von brikler (18.04.2018 10:07:15)
Offline
laptop2 systemd frei: [tom@donar ~]$ cat getty #!/usr/bin/env ruby # def start(id, cmd) #p id, cmd pid = fork do Process.setsid() exec(*cmd) end puts "Pid: #{pid}" end (3..5).each do |n| start("agetty#{n}", %W[agetty tty#{n}]) #start("xterm#{n}", %W[term -rv -hold -e echo tty#{n}]) end [tom@donar ~]$ ps -ax | grep getty 252 tty2 Ss+ 0:00 /sbin/agetty -8 -s 38400 tty2 linux 258 ? Ss 0:00 /sbin/agetty -8 -s 38400 tty3 linux 263 ? Ss 0:00 /sbin/agetty -8 -s 38400 tty4 linux 917 ? Ss 0:00 agetty tty3 920 ? Ss 0:00 agetty tty4 923 ? Ss 0:00 agetty tty5 1404 tty3 Ss+ 0:00 agetty tty3 1407 tty4 Ss+ 0:00 agetty tty4 1410 tty5 Ss+ 0:00 agetty tty5 1429 pts/1 S+ 0:00 grep --color=tty -d skip getty
in dem fall hab ichs mit minirc gestartet, aber das sollt keinen unterschied machen.
ich hab das unveränderte schnippsel zwei mal laufen lassen, mit zwei verschiedenen ergebnisse…
Nein, daß sind keine "zwei verschiedenen Ergebnisse", sondern genau daß, was aufgrund deiner ersichtlichen Sachlage (die Infos, die du preisgibst) und Aktionen zu erwarten wäre:
a) Durch den Boot mit minirc ff. wurden auf tty2-4 schon gettys gestartet (sieht man an den kleinen PIDs).
b) Jetzt bügelst du mit dem ersten Teilschnipsel-Code die laufenden gettys auf tty3 und tty4 weg (sieht man an den Fragezeichen wo die PID bei ps (258,263) steht. Dadurch erhältst du 3 neue gettys die auf tty3-5 gebunden sind (PIDs 917,920,923).
c) Im zweiten Schnipsel-Lauf überbügelst du diese gettys nun wieder mit 3 neuen (1404,1407,1410), //Edit: dadurch verlieren die gettys aus dem 1.Lauf ihre Binding zu dent ttys. Diese neuen sind dann alle an die richtigen /dev/ttyX gebunden und alle mit dem richtigen Status: Ss+.
Das ganze entspricht also genau deinem Tun, mehr kann man dazu nicht sagen... Da du ja (wie immer) alle weiterführenden etwaigen Probleme,Meldungen,etc. wegläßt (z.B. ob diese neuen gettys nun ein Login zuließen)
es liegt leider am system
Richtiger Ansatz! Und am Administrator desselbigen, steinigt Ihn, Jehova! ;-)
An einem (reproduzierbarem!) Standard-System läuft - wie aufgezeigt - "out of the box" das *gesamte* init-Skript als init-Ersatz, da:
1. Ruby eine geile Programmiersprache ist (sage ich immer!) == FAKT.
2. Das Skript sowohl semantisch als auch funktional genau das macht, was es soll und verspricht == FAKT.
Was bei dir nun abweicht, daß mußt du nun rausfinden wenn's Dich interessiert.
Beitrag geändert von GerBra (18.04.2018 13:13:45)
Offline
also gut, das schnippsel funktioniert und aber nicht im init script bei mir
mit finit
[tom@donar ~]$ ps -ax | grep getty
862 pts/0 S+ 0:00 grep --color=tty -d skip getty
[tom@donar ~]$ sudo ./getty
[sudo] Passwort für tom:
Pid: 866
Pid: 869
Pid: 872
Pid: 875
Pid: 880
[tom@donar ~]$ ps -ax | grep getty
866 tty1 Ss+ 0:00 agetty tty1
869 tty2 Ss+ 0:00 agetty tty2
872 tty3 Ss+ 0:00 agetty tty3
875 tty4 Ss+ 0:00 agetty tty4
880 tty5 Ss+ 0:00 agetty tty5
884 pts/0 S+ 0:00 grep --color=tty -d skip getty
ich dank dir für deine hilfe
…und damit beende ich meinen versuch
Beitrag geändert von brikler (18.04.2018 14:33:08)
Offline
Seiten: 1