แอปพลิเคชั่นที่ทำงานกับ GUI รันคำสั่งเชลล์ในพื้นหลังหรือไม่


29

ฉันได้ย้ายไปยัง Ubuntu 16.04 เพียง 2 วันก่อนจาก Windows ฉันชอบวิธีที่เราสามารถปรับแต่ง Unity Desktop ฉันแค่เล่นกับรูปลักษณ์ของสภาพแวดล้อมเดสก์ท็อป เช่นเดียวกับใน Windows ฉันต้องการให้ตัวเรียกใช้อยู่ที่ด้านล่างของหน้าจอ ใน Googling ฉันพบคำสั่งที่มีลักษณะดังนี้:

gsettings set com.canonical.Unity.Launcher launcher-position Bottom

นอกจากนี้ยังมี unity-tweak-tool และ dconf editor เพื่อให้งานเสร็จสมบูรณ์ แต่นี่เป็นวิธีการของ GUI ในการทำให้สิ่งต่างๆสำเร็จ

คำถามของฉันคือ:

  • แอปพลิเคชันที่ใช้ GUI เหล่านี้ยังใช้คำสั่งเดียวกันในพื้นหลังหรือไม่
  • ทำอย่างไรจึงจะมองลอดการทำงานภายในของแอพพลิเคชั่นเหล่านี้ได้? ฉันหมายถึงมีวิธีใดที่จะดูคำสั่งจริง ๆ ที่ถูกเรียกใช้งานด้วยการคลิกปุ่มทุกครั้งหรือไม่?
  • แอปพลิเคชั่นเหล่านี้เปิด Terminal ในพื้นหลังและรันคำสั่งเหล่านี้หรือไม่?

คำตอบที่นี่บอกวิธีรับตัวอธิบายไฟล์มาตรฐานของกระบวนการ แต่ฉันไม่ได้อะไรเลยในผลลัพธ์

ยิ่งกว่านั้นstrace -p pid -o output.txtคำสั่งจะส่งข้อความจำนวนมากไปยังไฟล์

ดังนั้นในระยะสั้นการทำสิ่งต่าง ๆ โดยใช้แอปพลิเคชัน GUI เหมือนกับการทำสิ่งต่าง ๆ จาก commandline หรือไม่

คำตอบ:


35

แอปพลิเคชันที่ใช้ GUI เหล่านี้ยังใช้คำสั่งเดียวกันในพื้นหลังหรือไม่

ใช่และไม่. พวกเขาเขียนไปยังdconfฐานข้อมูลของการตั้งค่า แต่พวกเขาอาจใช้วิธีที่แตกต่างกันในการทำเช่นนั้น โปรแกรมที่เขียนใน Python จะใช้gi.repository.Gioโมดูล (ฉันรู้เพราะฉันใช้มันมาก) หรือพวกเขาสามารถใช้gsettingsเป็นคำสั่งภายนอกได้โดยการเรียกใช้subprocess.Popen(['gsettings','org.some.schema','some-key','value'])และโดยทั่วไปจะเรียกใช้เป็นคำสั่งเชลล์ โปรแกรม AC จะใช้สิ่งที่คล้ายกันน่าจะเป็นgio.hไลบรารีหรืออาจใช้exec()ตระกูลของฟังก์ชั่นเพื่อทำเช่นเดียวกับPopenในงูหลาม ดังนั้นเพื่อตอบคำถามชื่อของคุณ: "แอพพลิเคชั่นที่ใช้ GUI รันคำสั่งเชลล์ในพื้นหลังหรือไม่" พวกเขาทำได้ แต่มีแนวโน้มว่ามันไม่จำเป็นเพราะมีห้องสมุดสำหรับภาษาใดก็ตามที่แอพเขียนขึ้นและมีแนวโน้มว่าจะเร็วขึ้นเล็กน้อยในการใช้ฟังก์ชั่นห้องสมุดมากกว่าวางไข่กระบวนการใหม่

เพื่อให้ตัวอย่างของวิธีการทำงานกับไลบรารี / โมดูลโปรดดูที่ซอร์สโค้ดของตัวบ่งชี้รายการตัวเรียกใช้ของฉัน ที่นั่นฉันได้เขียนฟังก์ชั่นเพื่อสร้างอินสแตนซ์ของGio.Settingsคลาสและจากนั้นใช้เพื่อแก้ไข Unity launcher ขึ้นอยู่กับประเภทของรายการที่คุณต้องการมี

ทำอย่างไรจึงจะมองลอดการทำงานภายในของแอพพลิเคชั่นเหล่านี้ได้? ฉันหมายถึงมีวิธีใดที่จะดูคำสั่งจริง ๆ ที่ถูกเรียกใช้งานด้วยการคลิกปุ่มทุกครั้งหรือไม่?

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

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

แอปพลิเคชั่นเหล่านี้เปิด Terminal ในพื้นหลังและรันคำสั่งเหล่านี้หรือไม่?

ไม่ไม่มีขั้วต่อ หลายโปรแกรมรู้ว่าdconfฐานข้อมูลสำหรับผู้ใช้นั้นอยู่ที่ไหนและเขียนอยู่ตรงนั้น นอกจากนี้ยังมีบัสการสื่อสารระหว่างกระบวนการที่เรียกว่าdbusโปรแกรมที่สามารถส่งสัญญาณและโปรแกรมจะเป็น "เฮ้นั่นคือข้อความสำหรับฉัน!"

ภาคผนวก

  • แอปพลิเคชันสามารถเรียกใช้แอปพลิเคชันอื่นได้หรือไม่ ใช่ทำได้ผ่านการเรียกมาตรฐานfork()และการexecve()เรียกระบบ สาระสำคัญของการสร้างกระบวนการบน Linux และระบบ * nix อื่น ๆ นั้นขึ้นอยู่กับสองสิ่งนี้ กลไกของเชลล์สำหรับการรันคำสั่งที่ไม่ใช่ builtin นั้นใช้มากโดยเฉพาะ เมื่อคุณเรียกใช้แบบโต้ตอบ

    $ ls 
    

    เชลล์จะสร้างกระบวนการใหม่ผ่านทางfork()กระบวนการนั้นจะทำงานexecve() ซึ่งจะเริ่มlsขึ้น เพราะexecve()กระบวนการแยกทางใหม่นั้นจะเป็นlsอย่างไร สายระบบคือสิ่งที่จะช่วยให้อ่านกลับการส่งออกของpipe() lsฉันขอแนะนำอย่างยิ่งให้อ่านคำตอบของฉันสำหรับความแตกต่างระหว่างไพพ์และการเปลี่ยนเส้นทางเพื่อให้เข้าใจว่ากลไก|ไพพ์ทำงานอย่างไร - ไม่ใช่แค่ตัวดำเนินการ แต่จริงๆแล้วเป็น syscall

  • แอปพลิเคชันสามารถเรียกใช้คำสั่งเชลล์ได้หรือไม่ ไม่ได้เชลล์เข้าใจไวยากรณ์โดยเชลล์เองเท่านั้น อย่างไรก็ตามสิ่งที่คุณสามารถทำได้คือเริ่มเชลล์ด้วย-cสวิตช์บรรทัดคำสั่งและจัดเตรียมคำสั่งที่เหมาะสม สิ่งนี้มักจะใช้สำหรับทางลัดแบบกำหนดเองที่ตั้งใน GNOME หรือสภาพแวดล้อมเดสก์ท็อปอื่น ๆ เนื่องจากทางลัดแบบกำหนดเองนั้นใช้งานได้บนเอ็กซีคิวต์และไม่มีเชลล์ที่จะเข้าใจไวยากรณ์ ดังนั้นในตัวอย่างคุณจะต้องbash -c 'xdotool key Ctrl+Alt+T'ใช้xdotoolคำสั่งทางอ้อมหรือbash -c 'cd $HOME/Desktop; touch New_File'สร้างไฟล์ใหม่บนเดสก์ท็อปผ่านทางลัด นี่เป็นตัวอย่างที่น่าสนใจโดยเฉพาะอย่างยิ่งที่คุณสามารถใช้ตัวแปรเชลล์เนื่องจากคุณใช้เชลล์อย่างชัดเจน


2
ขอบคุณ @Serg มากสำหรับคำอธิบายโดยละเอียดและตอบคำถามแต่ละข้อแยกต่างหากและเป็นระบบ!
ptmdevncoder

@Logan ความสุขของฉันเสมอยินดีที่จะช่วยเหลือ :)
Sergiy Kolodyazhnyy

1
โชคดีที่แหล่งข้อมูลสำหรับเครื่องมือดังกล่าวมีให้ตั้งแต่ FLOSS ดังนั้นฉันจะบอกว่าการย้อนกลับของพวกเขานั้นเกินความจริงเล็กน้อยในกรณีนี้ :)
Andrea Lazzarotto

1
@AndreaLazzarotto อ๋อเครื่องมือ Unity Tweak และเครื่องมือแก้ไข Dconf - เป็นโอเพ่นซอร์สดังนั้นจึงไม่จำเป็นต้องเปลี่ยนวิศวกรเหล่านั้น ในคำตอบของฉันฉันเก็บทุกอย่างมากโดยทั่วไปและพยายามที่จะครอบคลุมไม่เพียง แต่เครื่องมือเหล่านั้น แต่เป็นไปได้อื่น ๆ
Sergiy Kolodyazhnyy

เร็วขึ้นเป็นจุดสำหรับแอปพลิเคชัน GUI การหลบหนีหรือการจัดเรียงค่าสำหรับใช้กับเครื่องมือเชลล์นั้นน่าเบื่อง่ายต่อการทำผิดและไม่มีจุดหมายหากคุณสามารถใช้ไลบรารี การดีบักอีกครั้ง: หากแอปพลิเคชันติดตั้งด้วยสัญลักษณ์การดีบักและเขียนในภาษาที่รองรับโดย gdb (บนเดเบียนเช่นโดยการติดตั้งแพ็คเกจ -dbg ที่สอดคล้องกัน) คุณไม่จำเป็นต้องรู้แอสเซมเบลอร์: gdb จะแสดงซอร์สโค้ดโดยใช้ แก้ไขข้อมูลในขณะที่คุณดำเนินการผ่านแอปพลิเคชัน สิ่งที่ยากกว่าคือการหาจุดเริ่มต้นที่เหมาะสมในการเริ่มแก้ไขข้อบกพร่องเนื่องจากการสร้าง GUI สำเร็จรูปที่น่าเบื่อ
Jonas Schäfer

21

สืบในสิ่งที่เกิดขึ้น

เครื่องมือแก้ไขการตั้งค่าเหล่านี้ส่วนใหญ่สามารถดูได้จากการทำงาน

dconf watch /

ในอาคารผู้โดยสาร

gsettings

นอกจากนี้ส่วนใหญ่แล้วเพื่อให้บรรลุสิ่งที่คุณเห็นเกิดขึ้นกับคำสั่งข้างต้นแอปพลิเคชันเหล่านี้จะต้องแก้ไขdconfฐานข้อมูล (เพิ่มเติมด้านล่าง) สิ่งนี้สามารถทำได้โดยตรงโดยใช้ตัวเลือก cli ของdconf (ซึ่งไม่ต้องการ) หรือโดยการเรียกใช้gsettingsคำสั่งที่เกี่ยวข้องเช่นที่คุณพูดถึง

ในการรันคำสั่งเหล่านี้ไม่จำเป็นต้องมีหน้าต่างเทอร์มินัลดังที่คุณเห็นในตัวอย่าง

เกี่ยวกับ, gsettings, dconf และฐานข้อมูล dconf

gsettingsเป็นส่วนหน้า cli dconfซึ่งในทางกลับกันแก้ไขdconfฐานข้อมูลที่เก็บการตั้งค่าส่วนใหญ่ในรูปแบบไบนารี ดูคำตอบที่ดีนี้ด้วย

dconfฐานข้อมูลโดยวิธีการที่ยังสามารถได้รับการแก้ไขจาก GUI โดยdconfบรรณาธิการซึ่งอยู่ในที่เก็บ:

ป้อนคำอธิบายรูปภาพที่นี่

ตัวอย่างการทำงาน

ในหลาม

ป้อนคำอธิบายรูปภาพที่นี่

เพื่อแสดงให้คุณเห็นสิ่งที่เกิดขึ้นภายใต้ประทุนด้านล่างตัวอย่างการทำงานเพื่อสลับตำแหน่งตัวเรียกใช้ของคุณจาก GUI ในปุ่ม (สลับ) เดียว:

#!/usr/bin/env python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
import subprocess

key = ["com.canonical.Unity.Launcher", "launcher-position"]

class ToggleWin(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Toggle")
        button = Gtk.Button("Toggle launcherposition")
        button.connect("clicked", self.toggle)
        self.add(button)

    def toggle(self, *args):
        # read the current setting on launcher position
        current = subprocess.check_output([
            "gsettings", "get", key[0], key[1]
            ]).decode("utf-8").strip()
        # toggle to the other option
        new = "'Left'" if current == "'Bottom'" else "'Bottom'"
        subprocess.Popen([
            "gsettings", "set", key[0], key[1], new
            ])

def delete_actions(*args):
    Gtk.main_quit()

def miniwindow():
    window = ToggleWin()
    window.connect("destroy", delete_actions)
    window.show_all()
    Gtk.main()

miniwindow()
  • วางรหัสลงในช่องว่าง file.py
  • เรียกใช้โดยคำสั่ง:

    python3 /path/to/file.py
    

...และขอให้สนุก.

ข ไอคอนตัวเรียกใช้

แม้แต่ตัวเรียกใช้งานง่ายๆก็สามารถทำงานได้จาก GUI:

ป้อนคำอธิบายรูปภาพที่นี่

[Desktop Entry]
Name=Set launcherposition
Exec=zenity --info --text="Right- click to set launcher position"
Type=Application
StartupNotify=False
Icon=preferences-system

Actions=Launcher to bottom;Launcher on the left;

[Desktop Action Launcher to bottom]
Name=Launcher to bottom
# right click option to set launcher to bottom
Exec=gsettings set com.canonical.Unity.Launcher launcher-position Bottom

[Desktop Action Launcher on the left]
Name=Launcher on the left
# right click option to set launcher to left
Exec=gsettings set com.canonical.Unity.Launcher launcher-position Left
  • วางรหัสลงในไฟล์เปล่าแล้วบันทึกเป็น setlauncher.desktop
  • ลากไปที่ตัวเรียกใช้และคลิกขวา

สำหรับการใช้งานถาวรให้เก็บไว้ใน~/.local/share/applications(สำหรับการใช้งานในท้องถิ่น) หรือ~/usr/share/applicationsสำหรับผู้ใช้ทั้งหมด


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