Leggi credenziali(7), fork(2), execve(2). La chiamata di sistema fork è il modo in cui vengono creati i processi (oggi, fork
è spesso implementato con clone(2) ma puoi vederlo come un dettaglio di implementazione). La chiamata di sistema exec è il modo in cui vengono avviati i programmi eseguibili. Ricorda che tutto è fatto da qualche processo con alcune chiamate di sistema (elencate in syscalls(2)). Il primissimo processo (init o systemd) è stato avviato magicamente dal kernel al momento dell'avvio. Altri processi sono stati avviati da fork(2). I kernel Linux moderni a volte, ma raramente, avviano magicamente alcuni processi speciali (ad es. /sbin/hotplug
) o thread del kernel (ad esempio kworker
, kswapd
....).
Quindi sì, ogni processo (e ogni file) ha un proprietario (tecnicamente l'uid, un piccolo numero non negativo) e un gruppo (il gid). L'uid 0 è per root e ha permessi extra.
Leggi anche su setuid (e setreuid(2)...) È complicato.
significa che l'altro proprietario non può eseguire quel processo?
Un processo è già in esecuzione (ma potrebbe essere inattivo o in attesa), quindi nessuno può eseguirlo di nuovo. Non confondere un processo (qualcosa di dinamico) con il programma (un file eseguibile, spesso in formato ELF) in esecuzione al suo interno.
Un dato programma (ad es. /bin/bash
) può essere eseguito in diversi processi. Molti eseguibili rimangono sul tuo disco senza avere (in un dato istante) alcun processo che li esegua.
Su Linux, proc(5) è molto utile per interrogare il kernel sullo stato dei processi. Prova ad esempio cat /proc/$$/status
e cat /proc/self/maps
. Vedi anche pgrep(1), ps(1), top(1).
Ogni processo ha il proprio spazio di indirizzi virtuali, la propria tabella di descrittori di file, la propria directory di lavoro (e spesso diversi thread, vedi pthreads(7)) ecc. ecc...
significa che altri proprietari non possono eseguire/terminare/riprendere quel processo?
L'esecuzione di un processo non ha alcun senso (lo è già in esecuzione). Tuttavia, l'eseguibile del processo di pid 1234 è disponibile come /proc/1234/exe
symlink, e potresti usarlo per execve(2) - ma probabilmente non dovresti -. Le regole di autorizzazione per execve
si applica.
Per uccidere (2) un processo, generalmente dovresti avere lo stesso uid. Tuttavia, la documentazione dice:
For a process to have permission to send a signal, it must either be privileged (under Linux: have the CAP_KILL capability in the user namespace of the target process), or the real or effective user ID of the sending process must equal the real or saved set-user-ID of the target process. In the case of SIGCONT, it suffices when the sending and receiving processes belong to the same session.
Per fermare un processo, usa il SIGSTOP
(o SIGTSTP
) segnale usato con kill(2). Vedi signal(7).
Per riprendere un processo interrotto, usa il SIGCONT
segnale.
Il proprietario è solitamente l'utente che ha avviato tale processo. Il comando potrebbe essere eseguibile da altri utenti, ma sarebbe un processo diverso.
significa che l'altro proprietario non può eseguire quel processo?
Non c'è nessun altro proprietario. Non confondere programmi (file eseguibili) e processi (programmi in esecuzione).
Significa che altri proprietari non possono eseguire/terminare/riprendere quel processo?
L'unico proprietario ha già avviato l'iter. Se intendi altri utenti , non proprietari, dipende.
Root, ovvero un utente con uid
uguale a 0, ha piena potenza. Altri utenti che condividono lo stesso uid
sono, dal punto di vista del sistema operativo, lo stesso utente, quindi hanno pieno potere anche sul processo.
Gli utenti con un uid diverso non saranno in grado di interrompere/arrestare/riprendere il processo, a meno che non siano autorizzati a passare al proprietario o al privilegio di root tramite sudo
o un comando simile o, in misura minore, se sono collegati a quel processo dalla loro gerarchia.