# การรันคำสั่ง Shell

ฟังก์ชันนี้ช่วยให้คุณสามารถรันคำสั่ง Shell หรือสคริปต์ Shell ทั้งหมดบนอุปกรณ์ได้ คำสั่งทั้งหมดจะถูกรันด้วยสิทธิ์ root และเพื่อรองรับสคริปต์ที่ทำงานเป็นเวลานาน ฟังก์ชันนี้ยังรองรับการรันสคริปต์ในเบื้องหลังโดยไม่ปิดตัวเอง

## การรันคำสั่งเบื้องหน้า (Foreground)

คุณสามารถใช้งานดังตัวอย่างด้านล่างเพื่อรันคำสั่งหรือสคริปต์ได้อย่างรวดเร็ว การดำเนินการนี้จะบล็อกโปรเซสปัจจุบัน ดังนั้นสคริปต์หรือคำสั่งของคุณไม่ควรใช้เวลารันนานเกินไป เหมาะสำหรับสคริปต์ที่ใช้เวลาสั้นๆ (ภายใน 0-10 วินาที)

```python
cmd = d.execute_script("whoami")
```

```python
>>> d.execute_script("notexist")
exitstatus: 127
stderr: "mksh: <stdin>[2]: notexist: inaccessible or not found\n"
```

ผลลัพธ์จะคืนค่า status code, standard output และ standard error

```python
print (cmd.stdout)
print (cmd.stderr)
print (cmd.exitstatus)
```

```python
>>> result = d.execute_script("id")
>>> print (result.stdout)
b'uid=0(root) gid=0(root)\n'
>>> print (result.stderr)
b''
>>> print (result.exitstatus)
0
```

## การรันคำสั่งเบื้องหลัง (Background)

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

การเรียกใช้ด้านล่างจะรันสคริปต์ที่ใช้เวลานาน `sleep` และคืนค่าสตริง `sid` ซึ่งเป็น ID ของสคริปต์เบื้องหลังนี้

```python
script = "sleep 100; exit 0;"
sid = d.execute_background_script(script)
```

หากสคริปต์เกิดสถานการณ์ที่ไม่คาดคิด คุณสามารถใช้การเรียกใช้ด้านล่างเพื่อบังคับจบการทำงานของสคริปต์ที่กำลังรันในเบื้องหลังได้

```
d.kill_background_script(sid)
```

คุณสามารถตรวจสอบว่าสคริปต์เบื้องหลังทำงานเสร็จสิ้นแล้วหรือไม่ผ่าน `sid` โดยใช้การเรียกใช้ด้านล่าง

```python
d.is_background_script_finished(sid)
```

```python
>>> script = "sleep 100; exit 0;"
>>> sid = d.execute_background_script(script)
>>> print (sid)
ba06da93-c3aa-4457-b90e-247e42a16207
>>> d.is_background_script_finished(sid)
False
>>> d.kill_background_script(sid)
True
>>> d.is_background_script_finished(sid)
True
```