คำถามติดแท็ก exec

กลุ่มฟังก์ชัน exec () แทนที่อิมเมจกระบวนการปัจจุบันด้วยอิมเมจกระบวนการใหม่โดยยังคงรักษา pid และไปป์ของกระบวนการเก่าไว้ แท็กนี้ยังใช้สำหรับเชลล์ในตัวซึ่งสามารถใช้เพื่อแทนที่เชลล์ปัจจุบันด้วยโปรแกรมหรือสิ่งต่างๆที่เกี่ยวข้องกับการเปลี่ยนเส้นทาง


4
จะเกิดอะไรขึ้นเมื่อฉันเรียกใช้ไฟล์ในเชลล์
ดังนั้นฉันคิดว่าฉันมีความเข้าใจที่ดีในเรื่องนี้ แต่เพียงแค่ทดสอบ (เพื่อตอบสนองต่อการสนทนาที่ฉันไม่เห็นด้วยกับใครบางคน) และพบว่าความเข้าใจของฉันมีข้อบกพร่อง ... ในรายละเอียดมากที่สุดจะเกิดอะไรขึ้นเมื่อฉันเรียกใช้ไฟล์ในเชลล์? สิ่งที่ฉันหมายถึงคือถ้าฉันพิมพ์: ./somefile some argumentsลงในเปลือกของฉันและกดย้อนกลับ (และsomefileมีอยู่ใน cwd และฉันได้อ่าน + ดำเนินการสิทธิ์บนsomefile) แล้วเกิดอะไรขึ้นภายใต้ประทุน? ฉันคิดว่าคำตอบคือ: เปลือกทำ syscall ให้execผ่านเส้นทางไปsomefile เคอร์เนลตรวจสอบsomefileและดูหมายเลขมายากลของไฟล์เพื่อตรวจสอบว่าเป็นรูปแบบที่โปรเซสเซอร์สามารถจัดการได้หรือไม่ หากหมายเลขมายากลระบุว่าไฟล์อยู่ในรูปแบบที่โปรเซสเซอร์สามารถใช้งานได้ กระบวนการใหม่ถูกสร้างขึ้น (โดยมีรายการในตารางกระบวนการ) somefileถูกอ่าน / แมปกับหน่วยความจำ สแต็กถูกสร้างขึ้นและการดำเนินการข้ามไปยังจุดเริ่มต้นของรหัสsomefileโดยARGVเริ่มต้นไปที่อาร์เรย์ของพารามิเตอร์ (a char**, ["some","arguments"]) หากจำนวนมายากลเป็นshebangแล้วexec()spawns กระบวนการใหม่ดังกล่าวข้างต้น แต่ปฏิบัติการที่ใช้เป็นล่ามอ้างอิงโดย shebang (เช่น/bin/bashหรือ/bin/perl) และsomefileถูกส่งไปยังSTDIN หากไฟล์ไม่มีหมายเลขเวทย์มนตร์ที่ถูกต้องแสดงว่ามีข้อผิดพลาดเช่น "ไฟล์ไม่ถูกต้อง (หมายเลขเวทย์มนตร์ที่ไม่ดี): เกิดข้อผิดพลาดในรูปแบบ Exec" อย่างไรก็ตามมีคนบอกฉันว่าถ้าไฟล์เป็นข้อความธรรมดาเชลล์จะพยายามเรียกใช้คำสั่ง (เช่นถ้าฉันพิมพ์bash somefile) ฉันไม่เชื่อเรื่องนี้ แต่ฉันแค่ลองมันและมันก็ถูกต้อง ดังนั้นฉันจึงมีความเข้าใจผิดอย่างชัดเจนเกี่ยวกับสิ่งที่เกิดขึ้นจริงที่นี่และต้องการที่จะเข้าใจกลไก จะเกิดอะไรขึ้นเมื่อฉันเรียกใช้ไฟล์ในเชลล์ (ในรายละเอียดมากพอสมควร …
32 shell  kernel  exec  shebang 

3
'exec {fd} </ dev / watchdog' ทำอะไรใน Bash
นั่นคือตัวอักษร{fd}ไม่ใช่ตัวยึดตำแหน่ง ฉันมีสคริปต์ที่ทำสิ่งนี้และไม่ได้แหล่งข้อมูลใด ๆ และไม่มีการอ้างอิง {fd} ที่อื่น ทุบตีนี้ถูกต้องหรือไม่ exec {fd}&lt;/dev/watchdog

2
เหตุผลสำหรับผู้บริหารในสคริปต์ตัวตัด
ฉันได้เห็นตัวอย่างสคริปต์ wrapper ซึ่งโดยย่อมีดังต่อไปนี้: #!/bin/bash myprog=sleep echo "This is the wrapper script, it will exec "$myprog"" exec "$myprog" "$@" เท่าที่เห็นข้างต้นที่พวกเขาใช้เพื่อแทนที่เปลือกที่สร้างขึ้นใหม่เกือบจะในทันทีด้วยexec $myprogหนึ่งสามารถบรรลุเดียวกันโดยไม่ต้องexec: #!/bin/bash myprog=sleep echo "This is the wrapper script, it will exec "$myprog"" "$myprog" "$@" ในตัวอย่างล่าสุดนี้อินสแตนซ์ bash ใหม่จะเริ่มขึ้นและจากนั้น$myprogเริ่มต้นเป็นกระบวนการลูกของอินสแตนซ์ bash ประโยชน์ของแนวทางแรกคืออะไร?
27 bash  exec 

2
POSIX รับประกันเส้นทางไปยังยูทิลิตี้มาตรฐานหรือไม่?
จาก C วิธีที่ง่ายที่สุดในการใช้ยูทิลิตี้มาตรฐาน (เช่น ps) และอื่น ๆ คืออะไร? POSIX รับประกันว่ามาตรฐานpsนั้นอยู่ใน/bin/psหรือฉันควรรีเซ็ตตัวแปรสภาพแวดล้อม PATH เป็นสิ่งที่ฉันได้รับconfstr(_CS_PATH, pathbuf, n);จากนั้นเรียกใช้ยูทิลิตีผ่าน PATH-search หรือไม่
22 path  c  posix  exec 

2
มีวิธี POSIX ในการตั้งค่าอาร์กิวเมนต์ zeroth ของแอปพลิเคชันเป้าหมายหรือไม่?
ในbashคุณสามารถใช้exec -aและzshคุณสามารถผลัดกันยังตั้งARGV0ในการรันโปรแกรมที่มีการโต้แย้งข้อที่ศูนย์บาง แต่มียังเป็นวิธีที่ POSIX ของการทำเพื่อ? ตามที่แนะนำในความคิดเห็นนี้คุณสามารถสร้างลิงก์สัญลักษณ์ (ชั่วคราว) เพื่อให้ได้สิ่งนี้ แต่วิธีนี้ฉันไม่สามารถตั้งค่าอาร์กิวเมนต์ zeroth ใหม่ให้เป็นค่าใดก็ได้ตามอำเภอใจเช่นคำสั่งที่มีเส้นทางแน่นอน มีวิธีอื่นอีกไหม?

3
วิธีการ“ ถูกต้อง” เริ่มโปรแกรมประยุกต์จากเปลือก
ฉันพบว่ามันยากที่จะตอบคำถามอย่างแม่นยำ แต่ฉันจะทำให้ดีที่สุด ฉันใช้dwmเป็นตัวจัดการหน้าต่างเริ่มต้นและdmenuเป็นตัวเรียกใช้แอปพลิเคชันของฉัน ฉันแทบจะไม่ได้ใช้แอปพลิเคชัน GUI นอกเหนือจากเบราว์เซอร์ของฉัน งานส่วนใหญ่ของฉันทำได้โดยตรงจากบรรทัดคำสั่ง นอกจากนี้ฉันเป็นแฟนตัวยงของความเรียบง่ายเกี่ยวกับระบบปฏิบัติการแอปพลิเคชั่นและอื่น ๆ หนึ่งในเครื่องมือที่ฉันไม่เคยได้รับคือตัวเปิดแอปพลิเคชัน สาเหตุหลักมาจากฉันขาดความเข้าใจที่แม่นยำในการทำงานของโปรแกรมเรียกใช้งาน / สิ่งที่พวกเขาทำ แม้การค้นหาทางอินเทอร์เน็ตที่ครอบคลุมจะแสดงคำอธิบายที่คลุมเครือเท่านั้น สิ่งที่ฉันต้องการจะทำคือกำจัดแม้กระทั่งตัวเรียกใช้งานแอปพลิเคชันของฉันเพราะนอกเหนือจากการวางไข่แอปพลิเคชันจริง ๆ แล้วฉันไม่ได้ใช้มันอย่างแน่นอน ในการทำเช่นนี้ฉันอยากจะรู้วิธีการ "เริ่มต้น" แอปพลิเคชันจากเปลือก โดยที่ความหมายของ "ถูกต้อง" สามารถประมาณได้โดย "เหมือนตัวเรียกใช้งานแอปพลิเคชันจะทำ" ฉันรู้เกี่ยวกับวิธีต่อไปนี้เพื่อวางไข่กระบวนการจากเปลือก: exec /path/to/Program แทนที่เชลล์ด้วยคำสั่งที่ระบุโดยไม่ต้องสร้างกระบวนการใหม่ sh -c /path/to/Program เรียกใช้กระบวนการที่ขึ้นกับเชลล์ /path/to/Program เรียกใช้กระบวนการที่ขึ้นกับเชลล์ /path/to/Program 2&gt;&amp;1 &amp; เรียกใช้กระบวนการอิสระเชลล์ nohup /path/to/Program &amp; เรียกใช้กระบวนการเชลล์อิสระและเปลี่ยนทิศทางเอาต์พุตไปที่ nohup.out อัปเดต 1: ฉันสามารถแสดงให้เห็นว่าอะไรเช่นdmenuสร้างใหม่จากการโทรซ้ำไปยังps -eflเงื่อนไขที่แตกต่างกัน มัน spawns เปลือกใหม่และเป็นลูกของนี้เปลือกแอพลิเคชัน/bin/bash …
21 shell  exec 

4
fork และ exec ทำงานอย่างไร
ฉันไม่ได้มีประสบการณ์มากนักเพียงแค่พยายามเข้ามามีส่วนร่วมในกระบวนการต่าง ๆ พวกเขาตีความถึงฮาร์ดแวร์จากระดับผู้ใช้อย่างไร ดังนั้นเมื่อคำสั่งถูกไล่ออกจากเชลล์ให้fork()สืบทอดกระบวนการลูกของมันและexec()โหลดกระบวนการลูกไปยังหน่วยความจำและดำเนินการ หากกระบวนการลูกมีคุณลักษณะทั้งหมดของกระบวนการหลัก (ซึ่งเป็นกระบวนการดั้งเดิม) ดังนั้นความต้องการของกระบวนการลูกนี้คืออะไร? กระบวนการต้นฉบับอาจถูกโหลดไปยังหน่วยความจำ สิ่งนี้forkและexecแนวคิดนี้ใช้กับโปรแกรมปฏิบัติการทั้งหมดใน UNIX หรือไม่? ชอบเชลล์สคริปต์หรือเพียงแค่คำสั่ง? มันใช้กับคำสั่ง shell builtin หรือไม่? การคัดลอกเมื่อเขียนแนวคิดที่ใช้ถ้าฉันจะรันคำสั่ง / สคริปต์หรือไม่ ขออภัยที่ถามคำถามหลายครั้ง แต่คำถามเหล่านี้มาถึงใจของฉันทันทีเมื่อฉันคิดเกี่ยวกับการดำเนินการคำสั่งใด ๆ
17 fork  exec 

6
เลือกล่ามหลังจากเริ่มต้นสคริปต์เช่นถ้า / else อยู่ใน hashbang
มีวิธีใดบ้างในการเลือกล่ามที่กำลังเรียกใช้สคริปต์แบบไดนามิก ฉันมีสคริปต์ที่ฉันใช้ในระบบที่แตกต่างกันสองระบบและล่ามที่ฉันต้องการใช้นั้นจะอยู่ในตำแหน่งที่ตั้งที่ต่างกันในทั้งสองระบบ สิ่งที่ฉันต้องทำคือเปลี่ยนสาย hashbang ทุกครั้งที่เปลี่ยนไป ฉันต้องการทำบางสิ่งที่เทียบเท่ากับตรรกะของสิ่งนี้ (ฉันรู้ว่าการสร้างที่แน่นอนนี้เป็นไปไม่ได้): if running on system A: #!/path/to/python/on/systemA elif running on system B: #!/path/on/systemB #Rest of script goes here หรือจะดีกว่านี้ก็เพื่อให้พยายามใช้ล่ามตัวแรกและหากไม่พบมันจะใช้ตัวที่สอง: try: #!/path/to/python/on/systemA except: #!path/on/systemB #Rest of script goes here เห็นได้ชัดว่าผมแทนสามารถดำเนินการได้เป็น /path/to/python/on/systemA myscript.py หรือ /path/on/systemB myscript.py ขึ้นอยู่กับที่ผม แต่ที่จริงผมมีสคริปต์เสื้อคลุมที่เปิดตัวmyscript.pyดังนั้นผมอยากจะระบุเส้นทางไปล่ามหลามทางโปรแกรมมากกว่าด้วยมือ

1
exec 3 <& 1 ทำอะไร
ฉันเข้าใจว่าexecสามารถเปลี่ยนเส้นทาง I / O บนเชลล์ปัจจุบันได้ แต่ฉันเห็นการใช้งานเช่น: exec 6&lt;&amp;0 # Link file descriptor #6 with stdin. # Saves stdin. exec 6&gt;&amp;1 # Link file descriptor #6 with stdout. # Saves stdout. จากที่ฉันเข้าใจว่า&lt;มีไว้สำหรับอินพุตสตรีม&gt;สำหรับสตรีมเอาต์พุต แล้วจะexec 3&lt;&amp;1ทำอย่างไรดี? PS: ฉันพบสิ่งนี้จากซอร์สโค้ดของ Bats

6
php shell_exec () การอนุญาตบน Linux Ubuntu
ฉันกำลังพัฒนาแอปพลิเคชัน php โดยใช้เซิร์ฟเวอร์ Linux ปัญหาของฉันกำลังshell_exec()เรียกใช้งานไฟล์ exe บางไฟล์ไม่ทำงาน (อันที่จริงไม่ใช่ exe เป็นไฟล์เรียกทำงานของ linux) echo shell_exec("whoami"); ฉันได้ภูต echo shell_exec("ls") ฉันได้รับชื่อไฟล์ แต่ echo shell_exec("php -v") ฉันไม่มีอะไรเลยหน้าว่าง echo shell_exec("php ....bla bla bla") หน้าว่างด้วย คำสั่งทั้งหมดเหล่านี้ถ้าฉันพิมพ์บน terminal (user hu) จะใช้งานได้ ฉันค้นหา google เป็นเวลาหลายชั่วโมงผู้คนบอกว่านั่นเพราะได้รับอนุญาต ฉันไม่มีประสบการณ์บน Linux ฉันต้องทำอย่างไรเพื่อรันโปรแกรมใน php?
13 linux  shell  php  exec 

4
ใช้เคส / ตัวอย่างการปฏิบัติสำหรับ Bash 'builtin exec
พิจารณาจากเอกสารของ Bash 'builtin exec: exec แทนที่เชลล์โดยไม่ต้องสร้างกระบวนการใหม่ โปรดระบุกรณีการใช้งาน / ตัวอย่างการปฏิบัติ ฉันไม่เข้าใจว่าสิ่งนี้สมเหตุสมผลหรือไม่ ฉัน googled และพบเกี่ยวกับI / O เปลี่ยนเส้นทาง คุณช่วยอธิบายให้ดีขึ้นได้ไหม?

3
ทำไมเราต้องส่งชื่อไฟล์สองครั้งในฟังก์ชั่น exec
ผมอ่านการเขียนโปรแกรมในสภาพแวดล้อมระบบปฏิบัติการยูนิกซ์ขั้นสูงโดยสตีเว่น, 8 THบท ฉันอ่านและเข้าใจทั้งหกฟังก์ชั่นของ exec สิ่งหนึ่งที่ฉันสังเกตเห็นคือในทุกฟังก์ชั่น exec: อาร์กิวเมนต์แรกคือชื่อไฟล์ / ชื่อพา ธ (ขึ้นอยู่กับฟังก์ชั่น exec) อาร์กิวเมนต์ที่สองคือ argv [0] ที่เราเข้าไปmain()ซึ่งเป็นชื่อไฟล์เอง ดังนั้นที่นี่เราต้องส่งชื่อไฟล์สองครั้งในฟังก์ชั่น มีเหตุผลอะไรบ้าง (เช่นเราไม่สามารถรับชื่อไฟล์จากชื่อพา ธ จากอาร์กิวเมนต์แรก)?


2
ทำไม vfork () ตั้งใจที่จะใช้เมื่อกระบวนการลูกเรียก exec () หรือ exit () ทันทีหลังจากการสร้าง?
แนวคิดระบบปฏิบัติการและ APUE พูด ด้วย vfork () กระบวนการหลักถูกระงับและกระบวนการลูกใช้พื้นที่ที่อยู่ของพาเรนต์ เนื่องจาก vfork () ไม่ได้ใช้ copy-on-write ถ้ากระบวนการลูกเปลี่ยนแปลงหน้าใด ๆ ของพื้นที่ที่อยู่ของผู้ปกครองเพจที่ถูกแก้ไขจะปรากฏให้ผู้ปกครองเห็นได้เมื่อดำเนินการต่อ ดังนั้นvfork () ต้องใช้ด้วยความระมัดระวังเพื่อให้แน่ใจว่ากระบวนการลูกไม่ได้แก้ไขพื้นที่ที่อยู่ของผู้ปกครอง vfork () มีวัตถุประสงค์เพื่อใช้เมื่อกระบวนการลูกเรียกใช้ exec () หรือ exit () ทันทีหลังจากการสร้าง ฉันจะเข้าใจประโยคสุดท้ายได้อย่างไร เมื่อกระบวนการลูกสร้างโดยการvfork()โทรexec()ไม่ได้exec()แก้ไขพื้นที่ที่อยู่ของกระบวนการหลักโดยการโหลดโปรแกรมใหม่หรือไม่ เมื่อกระบวนการลูกที่สร้างโดยการvfork()โทรexit()ไม่ exit()ได้แก้ไขพื้นที่ที่อยู่ของกระบวนการหลักเมื่อยกเลิกการเป็นเด็ก? ฉันชอบลีนุกซ์ ขอบคุณ
11 linux  process  exec  exit  vfork 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.