Pemeriksaan kewarasan:Sejauh yang saya mengerti, shell adalah antarmuka tempat pengguna dapat berinteraksi dengan OS, yaitu:menjalankan proses lain.
Ya, tetapi "shell" secara khusus adalah pengguna antarmuka, bukan antarmuka pemrograman. Program lain tidak diharuskan untuk berinteraksi dengannya – mereka dapat langsung menggunakan panggilan sistem yang sama untuk membuat proses baru.
Jadi shell baris perintah berada pada level yang sama dengan program lain, mis. manajer layanan, atau antarmuka pengguna grafis (cangkang grafis).
Meskipun shell (mis. Bash) hanyalah proses lain.
Ya. Pada sistem mirip Unix ini adalah proses yang benar-benar normal dan tidak memiliki hak istimewa.
Apakah ada cara untuk menjalankan proses yang tidak akan menjadi turunan dari proses shell?
Dari sudut pandang pengguna:ya, ada beberapa cara.
-
Kebanyakan shell memiliki
exec
kata kunci yang menyebabkan program baru untuk mengganti shell (mempertahankan PID dan induk yang sama), yang mungkin bukan maksud Anda, tetapi secara teknis seperti yang Anda minta. -
Sesi desktop grafis akan sering dimulai tanpa menjalankan bash atau shell lainnya, dan ini secara otomatis berlaku untuk aplikasi yang diluncurkan melalui menu grafis. Induk aplikasi akan menjadi proses apa pun yang bertanggung jawab untuk menampilkan menu (misalnya pengelola jendela atau panel).
-
systemd yang saat ini populer sistem init tidak menggunakan shell sama sekali saat memulai layanan, jadi Anda dapat menentukan .service dan memulainya – induk layanan adalah init itu sendiri. Ini juga memiliki fitur yang memungkinkan layanan sementara dibuat dengan cepat menggunakan
systemd-run
, dengan hasil yang sama.
Dari sudut pandang programmer, cukup gunakan fork()
dan execve()
panggilan sistem untuk meluncurkan proses baru. (Ada detail khusus OS, misalnya fork() sebenarnya bisa menjadi pembungkus untuk panggilan yang berbeda, tetapi masih berfungsi dengan cara yang sama.)
Memang, bahkan jika program ingin memanggil shell, itu akan melakukannya dengan membuat proses anak baru dan menjalankan /bin/sh menggunakan fork+exec yang sama. Tidak ada panggilan sistem khusus untuk menjalankan shell. (Pemrogram dapat menggunakan misalnya system() saat menulis dalam C, atau os.system() dengan Python, tetapi itu masih hanya pembungkus kenyamanan di sekitar fork/exec.)
Variabel lingkungan:Di bash, ada beberapa skrip yang dijalankan saat Anda menelurkan shell, mis. .bashrc, .bash_profile, dll. (tergantung pada jenis shell - interaktif vs non-interaktif, login vs non-login). Skrip ini menentukan variabel lingkungan. Jika ada cara untuk menjalankan proses terlepas dari shell apa pun, dari mana asal variabel lingkungan?
Yah, terkadang tidak. (Ini benar-benar masalah praktis saat mencoba membuat aplikasi grafis mengambil penyesuaian lingkungan, bergantung pada bagaimana lingkungan grafis tersebut dimulai.)
Namun secara keseluruhan, variabel lingkungan tidak unik untuk cangkang CLI. Setiap proses, tidak peduli bagaimana itu dimulai (bahkan termasuk proses init), menerima larik string yang berisi baris perintahnya – dan larik string yang berisi variabel lingkungannya. Saat meluncurkan proses anak, proses tersebut dapat menentukan lingkungan yang berbeda atau mengizinkan salinan lingkungannya sendiri untuk diwariskan.
Jadi saat Anda masuk, shell Anda sudah menerima beberapa variabel lingkungan awal dari induknya. Skrip startup tersebut (bashrc, dll.) hanyalah tempat yang nyaman bagi pengguna untuk menyesuaikan variabel lingkungan yang akan diwarisi oleh proses turunan shell.
Banyak bagian dari jawaban ini juga sepenuhnya berlaku untuk Windows - meskipun antarmuka grafisnya sedikit lebih rumit, cangkang CLI (cmd.exe dan PowerShell) masih merupakan program biasa yang tidak digunakan sama sekali dalam operasi normal. Satu-satunya perbedaan utama adalah bahwa Windows memiliki satu panggilan "CreateProcess" alih-alih panggilan "fork + exec" gaya Unix yang terpisah.
-
Itu betul. Pada akhirnya, shell akan menjalankan
exec
system call, yang tersedia di semua sistem operasi yang sesuai dengan POSIX, dan lebih umum di semua sistem operasi mirip Unix, termasuk Linux. Sistem operasi lain memiliki konsep serupa. Di Linux,exec
system call pada akhirnya akan memanggilexecve
fungsi, yang disediakan oleh kernel dan melakukan pekerjaan aktual memuat file yang dapat dieksekusi dan menjalankannya. -
Ya. Setiap proses dapat memanggil
exec
, dan tidak perlu berupa "cangkang". Misalnya saat Anda meluncurkan program dengan mengklik di browser sistem file, perangkat lunak desktoplah yang melakukanexec
panggilan, tidak ada shell. Perhatikan bahwa proses tersebut menjadi turunan dari perangkat lunak desktop yang meluncurkannya. Semua proses adalah anak dari satu proses lain, kecuali yang pertama, yang disebutinit
dan memiliki PID 1. Bertanggung jawab untuk menyiapkan sistem operasi saat memulai dan meluncurkan semua proses lainnya, seperti layanan latar belakang dan login desktop. Di Linux saat ini,systemd
sering digunakan sebagaiinit
proses, tetapi ada alternatif lain. -
Ada beberapa varian
exec
(execl
,execle
, ...) yang memiliki berbagai argumen selain nama program yang akan dijalankan. Terakhir,execve
system call mengambil nama program, daftar string yang merupakan argumen baris perintah, dan daftar string yang merupakan variabel lingkungan. Misalnya saat meluncurkan perangkat lunak dari browser sistem file, variabel lingkungan dapat disalin dari browser sistem file itu sendiri, mungkin dimodifikasi oleh browser sistem file. Ini sepenuhnya tergantung pada pemrogram browser sistem file.
Beberapa bacaan lebih lanjut:
- https://en.wikipedia.org/wiki/Exec_(system_call)
- https://en.wikipedia.org/wiki/Fork%E2%80%93exec
- https://man7.org/linux/man-pages/man2/execve.2.html