#1 15.04.2018 18:20:09

brikler
Mitglied

wer kennt sich mit ruby aus?

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

#2 16.04.2018 13:06:34

GerBra
Mitglied

Re: wer kennt sich mit ruby aus?

brikler schrieb:

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.

brikler schrieb:

eine tty wird erstellt, die anderen nicht, dafür kommen 4 fehler meldungen.

Vielleicht könnten diese hilfreich sein?

Offline

#3 16.04.2018 13:44:02

brikler
Mitglied

Re: wer kennt sich mit ruby aus?

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

#4 16.04.2018 19:58:58

GerBra
Mitglied

Re: wer kennt sich mit ruby aus?

brikler schrieb:

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.

brikler schrieb:

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.

brikler schrieb:
[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.

brikler schrieb:

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

#5 16.04.2018 21:17:56

brikler
Mitglied

Re: wer kennt sich mit ruby aus?

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.

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

#6 17.04.2018 13:10:37

GerBra
Mitglied

Re: wer kennt sich mit ruby aus?

brikler schrieb:
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"]

brikler schrieb:

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

#7 17.04.2018 14:18:40

brikler
Mitglied

Re: wer kennt sich mit ruby aus?

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…

GerBra schrieb:
[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

#8 17.04.2018 15:20:11

GerBra
Mitglied

Re: wer kennt sich mit ruby aus?

brikler schrieb:

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.

brikler schrieb:

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

#9 17.04.2018 16:39:41

brikler
Mitglied

Re: wer kennt sich mit ruby aus?

so ernst ist die sache nicht, minirc war die letzen tage mein haupt init und zu diesem skript verleitete mich die pure neugierde smile
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

#10 17.04.2018 19:18:14

GerBra
Mitglied

Re: wer kennt sich mit ruby aus?

brikler schrieb:

so ernst ist die sache nicht

Das sehe ich mittlerweile auch so...

brikler schrieb:

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?

brikler schrieb:

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

#11 17.04.2018 19:44:26

brikler
Mitglied

Re: wer kennt sich mit ruby aus?

GerBra schrieb:

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 wink

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

#12 17.04.2018 20:03:22

GerBra
Mitglied

Re: wer kennt sich mit ruby aus?

brikler schrieb:

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

#13 17.04.2018 22:43:39

GerBra
Mitglied

Re: wer kennt sich mit ruby aus?

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

#14 18.04.2018 09:33:40

brikler
Mitglied

Re: wer kennt sich mit ruby aus?

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 sad

Beitrag geändert von brikler (18.04.2018 10:07:15)

Offline

#15 18.04.2018 13:11:40

GerBra
Mitglied

Re: wer kennt sich mit ruby aus?

brikler schrieb:
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)

brikler schrieb:

es liegt leider am system sad

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

#16 18.04.2018 14:20:57

brikler
Mitglied

Re: wer kennt sich mit ruby aus?

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 smile
…und damit beende ich meinen versuch

Beitrag geändert von brikler (18.04.2018 14:33:08)

Offline

Schnellantwort auf dieses Thema

Schreibe deinen Beitrag und versende ihn
Deine Antwort

Fußzeile des Forums