Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: nomorelogic - Febbraio 06, 2025, 03:24:20 pm

Titolo: RunCommand e LXD, esecuzione bloccata
Inserito da: nomorelogic - Febbraio 06, 2025, 03:24:20 pm
ciao a tutti

il problema che ho riguarda RunCommand (unit process) ma si tratta di un caso particolare in quanto sto facendo delle prove con i container linux LXD.

Il mio sistema è DEVUAN:
Codice: [Seleziona]
uname -a
Linux myhost 6.1.0-30-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.124-1 (2025-01-12) x86_64 GNU/Linux

La versione di LXD:
Codice: [Seleziona]
$ lxc --version
5.0.2

Il programma è banalissimo, lo vedete sotto e, una volta compilato, deve essere lanciato da shell come utente root o con:
Codice: [Seleziona]
sudo ./testlxc

Quì sotto il codice.

Codice: [Seleziona]
program testlxc;
uses process;

const
  LXC_BIN = '/usr/bin/lxc';

var AStdOut: string;
begin

  Writeln(LXC_BIN + ' LIST ');
  RunCommand(LXC_BIN, ['list'], AStdOut);  // questo funziona
  Writeln('output: >>');
  Writeln(AStdOut);
  Writeln('<<');


  Writeln(LXC_BIN + ' INIT ');
  RunCommand(LXC_BIN, ['init', 'ubuntu:20.04', 'u1'], AStdOut);   // quì si blocca
  Writeln('output: >>');
  Writeln(AStdOut);
  Writeln('<<');

end.


La prima invocazione di RunCommand con il parametro 'list', funziona correttamente come ci si aspetta.
La seconda invocazione, con parametro 'init' invece si blocca.

Il risultato è il seguente:
Codice: [Seleziona]
$ sudo ./testlxc 
/usr/bin/lxc LIST
output: >>
+------+---------+------+------+-----------+-----------+
| NAME |  STATE  | IPV4 | IPV6 |   TYPE    | SNAPSHOTS |
+------+---------+------+------+-----------+-----------+
| m1   | STOPPED |      |      | CONTAINER | 0         |
+------+---------+------+------+-----------+-----------+

<<
/usr/bin/lxc INIT

Non riesco a capire dov'è il problema.
Qualche idea?

grazie
nomorelogic


Edit:
chiaramente eseguendo da terminale:
Codice: [Seleziona]
sudo lxc list 
o
Codice: [Seleziona]
sudo lxc init ubuntu:20.04 u1
il tutto funziona correttamente e senza intoppi.

Edit 2:
ho postato la richiesta anche nel forum ufficiale
https://forum.lazarus.freepascal.org/index.php/topic,70123.msg546225/topicseen.html#new (https://forum.lazarus.freepascal.org/index.php/topic,70123.msg546225/topicseen.html#new)
Titolo: Re:RunCommand e LXD, esecuzione bloccata
Inserito da: DragoRosso - Febbraio 06, 2025, 06:21:51 pm
A mio parere è sicuramente un problema di privilegi.

Occhio che la shell normale in Linux (così come il cmd in Windows) potrebbe agire in modo diverso se chiamata da un processo come il tuo programma oppure dal sistema (tramite il terminale).

E secondo me il debugger non ti aiuterebbe più di tanto anche se potessi lanciarlo come sudo.

Non ci sono strumenti in Linux per vedere e monitorare le attività anche come storico (tipo il log eventi di Windows) ?

O LCX non ha un proprio log ?
Titolo: Re:RunCommand e LXD, esecuzione bloccata
Inserito da: nomorelogic - Febbraio 07, 2025, 09:27:58 am
ora nel log non c'è nulla riguardo ai lanci dei singoli container
sto cercando di capire se posso aumentare il livello di log

per ora ho trovato come lanciare un monitor
e questo è quello che mi visualizza tral lancio del programma in free pascal fino al crash

Codice: [Seleziona]
# lxc monitor --type=logging --pretty
DEBUG  [2025-02-07T09:18:42+01:00] Event listener server handler started         id=0291e421-5d89-4bb2-8652-c739d874f13f local=/var/lib/lxd/unix.socket remote=@
DEBUG  [2025-02-07T09:18:46+01:00] Handling API request                          ip=@ method=GET protocol=unix url=/1.0 username=root
DEBUG  [2025-02-07T09:18:46+01:00] Handling API request                          ip=@ method=GET protocol=unix url="/1.0/instances?filter=&recursion=2" username=root
DEBUG  [2025-02-07T09:18:46+01:00] GetInstanceUsage started                      instance=m1 project=default
DEBUG  [2025-02-07T09:18:46+01:00] GetInstanceUsage finished                     instance=m1 project=default
DEBUG  [2025-02-07T09:19:05+01:00] Handling API request                          ip=@ method=GET protocol=unix url=/1.0 username=root
DEBUG  [2025-02-07T09:19:05+01:00] Handling API request                          ip=@ method=GET protocol=unix url="/1.0/instances?filter=&recursion=2" username=root
DEBUG  [2025-02-07T09:19:05+01:00] GetInstanceUsage started                      instance=m1 project=default
DEBUG  [2025-02-07T09:19:05+01:00] GetInstanceUsage finished                     instance=m1 project=default
Titolo: Re:RunCommand e LXD, esecuzione bloccata
Inserito da: DragoRosso - Febbraio 07, 2025, 09:49:50 am
E se lo lanci a riga di comando quali sono le differeneze ?

Penso che tu debba "carpire" qualche differenza che si palesa tra l'uno e l'altro metodo.

Anche perchè il problema sembra di capire è nella "riga di comando", quindi cosa fà Linux nei due casi.
Titolo: Re:RunCommand e LXD, esecuzione bloccata
Inserito da: nomorelogic - Febbraio 07, 2025, 10:06:57 am
lanciando a riga di comando è un po' diverso...
mi sa che appena h omodo mi metto a cercare nei forum lxd...

Codice: [Seleziona]
# lxc monitor --type=logging --pretty
DEBUG  [2025-02-07T10:04:23+01:00] Event listener server handler started         id=10b3533a-8b5a-4c7d-9263-240ba7560f2b local=/var/lib/lxd/unix.socket remote=@
DEBUG  [2025-02-07T10:04:38+01:00] Handling API request                          ip=@ method=GET protocol=unix url=/1.0 username=root
DEBUG  [2025-02-07T10:04:38+01:00] Handling API request                          ip=@ method=GET protocol=unix url=/1.0/events username=root
DEBUG  [2025-02-07T10:04:38+01:00] Event listener server handler started         id=5b060cef-15ed-4846-81fc-9c3b029fea3a local=/var/lib/lxd/unix.socket remote=@
DEBUG  [2025-02-07T10:04:38+01:00] Responding to instance create               
DEBUG  [2025-02-07T10:04:38+01:00] Handling API request                          ip=@ method=POST protocol=unix url=/1.0/instances username=root
DEBUG  [2025-02-07T10:04:38+01:00] Started operation                             class=task description="Creating instance" operation=2f75a618-e686-42e7-8d02-58fb8e710b39 project=default
DEBUG  [2025-02-07T10:04:38+01:00] New operation                                 class=task description="Creating instance" operation=2f75a618-e686-42e7-8d02-58fb8e710b39 project=default
DEBUG  [2025-02-07T10:04:38+01:00] Connecting to a remote simplestreams server   URL="https://cloud-images.ubuntu.com/releases"
DEBUG  [2025-02-07T10:04:38+01:00] Handling API request                          ip=@ method=GET protocol=unix url=/1.0/operations/2f75a618-e686-42e7-8d02-58fb8e710b39 username=root
DEBUG  [2025-02-07T10:04:41+01:00] Acquiring lock for image                      fingerprint=7ec2b4a12cc3835adc983d3f73883ba35e32438a027715d4c233e88bb8fe6773
DEBUG  [2025-02-07T10:04:41+01:00] Lock acquired for image                       fingerprint=7ec2b4a12cc3835adc983d3f73883ba35e32438a027715d4c233e88bb8fe6773
DEBUG  [2025-02-07T10:04:41+01:00] Acquiring lock for image                      fingerprint=7ec2b4a12cc3835adc983d3f73883ba35e32438a027715d4c233e88bb8fe6773
DEBUG  [2025-02-07T10:04:41+01:00] Image already exists in the DB                fingerprint=7ec2b4a12cc3835adc983d3f73883ba35e32438a027715d4c233e88bb8fe6773
DEBUG  [2025-02-07T10:04:41+01:00] Lock acquired for image                       fingerprint=7ec2b4a12cc3835adc983d3f73883ba35e32438a027715d4c233e88bb8fe6773
DEBUG  [2025-02-07T10:04:41+01:00] Instance operation lock created               action=create instance=u1 project=default reusable=false
INFO   [2025-02-07T10:04:41+01:00] Creating instance                             ephemeral=false instance=u1 instanceType=container project=default
DEBUG  [2025-02-07T10:04:41+01:00] Adding device                                 device=eth0 instance=u1 instanceType=container project=default type=nic
DEBUG  [2025-02-07T10:04:41+01:00] Adding device                                 device=root instance=u1 instanceType=container project=default type=disk
INFO   [2025-02-07T10:04:41+01:00] Created container                             ephemeral=false instance=u1 instanceType=container project=default
DEBUG  [2025-02-07T10:04:41+01:00] CreateInstanceFromImage started               instance=u1 project=default
DEBUG  [2025-02-07T10:04:41+01:00] EnsureImage started                           fingerprint=7ec2b4a12cc3835adc983d3f73883ba35e32438a027715d4c233e88bb8fe6773
DEBUG  [2025-02-07T10:04:41+01:00] Setting image volume size                     fingerprint=7ec2b4a12cc3835adc983d3f73883ba35e32438a027715d4c233e88bb8fe6773 size=
DEBUG  [2025-02-07T10:04:41+01:00] Checking image volume size                    fingerprint=7ec2b4a12cc3835adc983d3f73883ba35e32438a027715d4c233e88bb8fe6773
DEBUG  [2025-02-07T10:04:41+01:00] EnsureImage finished                          fingerprint=7ec2b4a12cc3835adc983d3f73883ba35e32438a027715d4c233e88bb8fe6773
DEBUG  [2025-02-07T10:04:41+01:00] Checking volume size                          instance=u1 project=default
DEBUG  [2025-02-07T10:04:41+01:00] Set new volume size                           instance=u1 project=default size=
DEBUG  [2025-02-07T10:04:41+01:00] Mounted ZFS dataset                           dev=default/containers/u1 driver=zfs path=/var/lib/lxd/storage-pools/default/containers/u1 pool=default
DEBUG  [2025-02-07T10:04:41+01:00] Unmounted ZFS dataset                         dev=default/containers/u1 driver=zfs path=/var/lib/lxd/storage-pools/default/containers/u1 pool=default volName=u1
DEBUG  [2025-02-07T10:04:41+01:00] UpdateInstanceBackupFile started              instance=u1 project=default
DEBUG  [2025-02-07T10:04:41+01:00] CreateInstanceFromImage finished              instance=u1 project=default
DEBUG  [2025-02-07T10:04:41+01:00] Mounted ZFS dataset                           dev=default/containers/u1 driver=zfs path=/var/lib/lxd/storage-pools/default/containers/u1 pool=default
DEBUG  [2025-02-07T10:04:41+01:00] UpdateInstanceBackupFile finished             instance=u1 project=default
DEBUG  [2025-02-07T10:04:41+01:00] Unmounted ZFS dataset                         dev=default/containers/u1 driver=zfs path=/var/lib/lxd/storage-pools/default/containers/u1 pool=default volName=u1
DEBUG  [2025-02-07T10:04:41+01:00] Success for operation                         class=task description="Creating instance" operation=2f75a618-e686-42e7-8d02-58fb8e710b39 project=default
DEBUG  [2025-02-07T10:04:41+01:00] Instance operation lock finished              action=create err="<nil>" instance=u1 project=default reusable=false
DEBUG  [2025-02-07T10:04:41+01:00] Handling API request                          ip=@ method=GET protocol=unix url=/1.0/instances/u1 username=root
DEBUG  [2025-02-07T10:04:41+01:00] Event listener server handler stopped         listener=5b060cef-15ed-4846-81fc-9c3b029fea3a local=/var/lib/lxd/unix.socket remote=@
Titolo: Re:RunCommand e LXD, esecuzione bloccata
Inserito da: nomorelogic - Febbraio 07, 2025, 04:38:38 pm
comunque questo programmino i C funziona benissimo...

Codice: [Seleziona]
#include <stdlib.h>
#include <stdio.h>
 
int main() {
  int status = 0;
 
  printf("lxc LIST\n");
  printf("Output >> \n");
  status = system("/usr/bin/lxc list -f json");
  printf("<< (Status=%d)\n\n", status);
 
  printf("lxc INIT\n");
  printf("Output >> \n");
  status = system("/usr/bin/lxc init ubuntu:20.04 u1");
  printf("<< (Status=%d)\n");
 
  return 0;
}
Titolo: Re:RunCommand e LXD, esecuzione bloccata
Inserito da: nomorelogic - Febbraio 11, 2025, 09:10:08 am
sembra sia un bug che si verifica quando si esegue un determinato programma esterno e si vuole leggere lo standard output

il link della segnalazione
https://gitlab.com/freepascal.org/fpc/source/-/issues/41146 (https://gitlab.com/freepascal.org/fpc/source/-/issues/41146)