Αναγνωριστικό διαδικασίας (PID). Πώς να σκοτώσετε μια διαδικασία Linux Process Pid


Παρά τη σταθερότητά του, ορισμένες εφαρμογές στο Linux μερικές φορές παγώνουν. Μερικές φορές οι εφαρμογές δεν ανταποκρίνονται ή απλά εκτελούνται τόσο αργά που δεν μπορείτε να τις κλείσετε σωστά. Ένας τρόπος για να σκοτώσετε μια εφαρμογή που εκτελείται στο Linux είναι να χρησιμοποιήσετε εντολές όπως kill ή killall. Ας δούμε πώς να χρησιμοποιήσουμε αυτές τις εντολές, να βρούμε το PID μιας διεργασίας και να στείλουμε ένα σήμα SIGKILL.

Με τον όρο διαδικασία θα εννοούμε ένα αντίγραφο του προγράμματος που εκτελείται στο σύστημα. Για παράδειγμα, εάν έχετε τρία παράθυρα αριθμομηχανής ανοιχτά (π.χ. gcalctool), αυτό σημαίνει ότι έχετε τρεις διεργασίες που εκτελούνται.

Εύρεση του PID μιας αναρτημένης διαδικασίας

Κάθε διεργασία στο Linux έχει το δικό της αναγνωριστικό που ονομάζεται PID. Πριν σταματήσετε μια διαδικασία, πρέπει να προσδιορίσετε το PID της. Για να το κάνουμε αυτό, θα χρησιμοποιήσουμε τις εντολές ps και grep. εντολή psέχει σχεδιαστεί για να εμφανίζει μια λίστα ενεργών διεργασιών στο σύστημα και πληροφορίες σχετικά με αυτές. εντολή grepεκτελείται ταυτόχρονα με το ps (σε ένα κανάλι) και θα αναζητήσει τα αποτελέσματα της εντολής ps. Μπορείτε να απαριθμήσετε όλες τις διεργασίες εκτελώντας στη γραμμή εντολών:

Αλλά, κατά κανόνα, ο κατάλογος είναι πολύ μεγάλος και η εύρεση της διαδικασίας που θέλουμε να "σκοτώσουμε" δεν είναι τόσο εύκολη. Εδώ έρχεται να σώσει η εντολή grep. Για παράδειγμα, για να βρείτε πληροφορίες σχετικά με μια διαδικασία που ονομάζεται gcalctool, εκτελέστε την εντολή:

Ps axu | grep gcalctool

Η εντολή grep θα αναζητήσει τα αποτελέσματα της εντολής ps και θα εκτυπωθούν μόνο εκείνες οι γραμμές που περιέχουν τη συμβολοσειρά (λέξη) gcalctool. Υπάρχει μια ενδιαφέρουσα λεπτομέρεια εδώ, για παράδειγμα, εάν δεν έχετε την εφαρμογή gcalctool σε λειτουργία, τότε μετά την εκτέλεση p.s grep gcalctoolΘα πάρεις:

$ ps axu | grep gcalctool yuriy 25587 0,0 0,0 10636 884 pts/2 S+ 10:20 0:00 grep --color=auto gcalctool

Δηλαδή, πήραμε την ίδια τη διαδικασία grep, αφού καθορίσαμε τη λέξη gcalctool ως παράμετρο στην εντολή και το grep βρέθηκε στην έξοδο της εντολής ΥΣΤΕΡΟΓΡΑΦΟ.

Εάν εκτελείται η διαδικασία gcalctool, θα λάβουμε:

Yuriy@yuriy-NIX:~$ ps axu | grep gcalctool yuriy 25609 7.6 0.4 500840 17964 ? Sl 10:20 0:00 gcalctool yuriy 25624 0,0 0,0 10640 884 pts/2 S+ 10:21 0:00 grep --color=auto gcalctool

Εδώ μας ενδιαφέρει η γραμμή: " yuriy 25609 7,6 0,4 500840 17964 ? Sl 10:20 0:00 gcalctool" Ο αριθμός 25609 είναι το PID της διαδικασίας gcalctool.

Υπάρχει ένας άλλος ευκολότερος τρόπος για να μάθετε το PID μιας διαδικασίας - αυτός εντολή pidof, το οποίο παίρνει το όνομα της διεργασίας ως παράμετρο και βγάζει το PID της. Ένα παράδειγμα εκτέλεσης της εντολής pidof:

$pidof gcalctool 25609

«Σκοτώνουμε» τη διαδικασία με την εντολή kill

Όταν το PID μιας διεργασίας είναι γνωστό, μπορούμε να το σκοτώσουμε εντολή kill. Η εντολή kill παίρνει το PID της διεργασίας ως παράμετρο. Για παράδειγμα, ας σκοτώσουμε τη διαδικασία με αριθμό 25609:

Kill 25609

Γενικά, η εντολή kill προορίζεται να στείλει ένα σήμα σε μια διεργασία. Από προεπιλογή, εάν δεν καθορίσουμε ποιο σήμα θα στείλουμε, αποστέλλεται το σήμα SIGTERM (από τη λέξη τερματισμός). Το SIGTERM λέει ότι η διαδικασία τερματίζεται. Κάθε σήμα έχει τον δικό του αριθμό. Το SIGTERM έχει τον αριθμό 15. Μια λίστα με όλα τα σήματα (και τους αριθμούς τους) που μπορεί να στείλει η εντολή kill μπορεί να ληφθεί εκτελώντας σκοτώνω -l. Για να στείλετε το σήμα SIGKILL (με αριθμό 9) στη διεργασία 25609, εκτελέστε τη γραμμή εντολών:

Kill -9 25609

Το σήμα SIGTERM μπορεί να μην σταματήσει τη διαδικασία (για παράδειγμα, εάν το σήμα παρεμποδιστεί ή μπλοκαριστεί), αλλά το SIGKILL σκοτώνει πάντα τη διαδικασία, καθώς δεν μπορεί να υποκλαπεί ή να αγνοηθεί.

Σκοτώνουμε διεργασίες με την εντολή killall

εντολή killallστο Linux έχει σχεδιαστεί για να «σκοτώνει» όλες τις διαδικασίες που έχουν το ίδιο όνομα. Αυτό είναι βολικό γιατί δεν χρειάζεται να γνωρίζουμε το PID της διαδικασίας. Για παράδειγμα, θέλουμε να κλείσουμε όλες τις διεργασίες που ονομάζονται gcalctool. Εκτέλεση στο τερματικό:

Killall gcalctool

Η εντολή killall, όπως και kill, στέλνει το σήμα SIGTERM από προεπιλογή. Για να στείλετε άλλο σήμα πρέπει να χρησιμοποιήσετε την επιλογή -μικρό. Για παράδειγμα:

Killall -s 9 gcalctool

συμπέρασμα

Ορισμένες διεργασίες δεν μπορούν να διακοπούν σε έναν κανονικό χρήστη. Για παράδειγμα, εάν η διαδικασία εκτελέστηκε ως root ή ως άλλος χρήστης στο σύστημα, τότε οι εντολές kill και killall πρέπει να εκτελεστούν ως superuser, προσθέτοντας sudo (στο Ubuntu):

Sudo kill 123

Υπάρχουν περιπτώσεις που εργάζεστε σε ένα GUI (όπως το GNOME) και δεν μπορείτε να ανοίξετε τον εξομοιωτή τερματικού για να σταματήσετε τη διαδικασία ανάρτησης. Στη συνέχεια, μπορείτε να μεταβείτε στην εικονική κονσόλα χρησιμοποιώντας τα πλήκτρα Ctrl+Alt+F1, συνδεθείτε σε αυτό και εκτελέστε εντολές από εκεί. Και μετά επιστρέψτε κάνοντας κλικ Ctrl+Alt+F7.

Βοήθεια για τη χρήση οποιασδήποτε εντολής μπορεί να ληφθεί με την εντολή man:

Man ps man grep man pidof man kill man killall


Σε αυτό το άρθρο, θα προσπαθήσουμε να δημιουργήσουμε μια λειτουργική μονάδα πυρήνα που μπορεί να αλλάξει το PID μιας ήδη εκτελούμενης διεργασίας στο Linux και επίσης να πειραματιστούμε με διεργασίες που έχουν λάβει αλλαγή PID.


Προειδοποίηση: Η αλλαγή του PID είναι μια μη τυπική διαδικασία και υπό ορισμένες συνθήκες μπορεί να οδηγήσει σε πανικό πυρήνα.

Η δοκιμαστική μονάδα μας θα εφαρμόσει τη συσκευή χαρακτήρων /dev/test, η οποία θα αλλάξει το PID της διαδικασίας κατά την ανάγνωση από αυτήν. Χάρη σε αυτό το άρθρο για ένα παράδειγμα εφαρμογής μιας συσκευής χαρακτήρων. Ο πλήρης κωδικός της ενότητας δίνεται στο τέλος του άρθρου. Φυσικά, η πιο σωστή λύση ήταν να προσθέσετε μια κλήση συστήματος στον ίδιο τον πυρήνα, αλλά αυτό θα απαιτούσε εκ νέου μεταγλώττιση του πυρήνα.

περιβάλλον

Όλες οι δραστηριότητες δοκιμής λειτουργικών μονάδων πραγματοποιήθηκαν σε μια εικονική μηχανή VirtualBox με διανομή LInux 64-bit και έκδοση πυρήνα 4.14.4-1. Η επικοινωνία με το μηχάνημα πραγματοποιήθηκε χρησιμοποιώντας SSH.

Προσπάθεια #1 απλή λύση

Λίγα λόγια για το ρεύμα: η τρέχουσα μεταβλητή οδηγεί σε μια δομή task_struct με μια περιγραφή της διαδικασίας στον πυρήνα (PID, UID, GID, cmdline, namespaces, κ.λπ.)

Η πρώτη ιδέα ήταν να αλλάξουμε απλώς την παράμετρο current->pid από τη μονάδα πυρήνα στην επιθυμητή.

Στατικό ssize_t device_read (αρχείο struct *filp, char *buffer, size_t μήκος, loff_t * offset) ( printk("PID: %d.\n",current->pid); current->pid = 1; printk("new PID: %d.\n",current->pid); , )
Για να ελέγξω τη λειτουργικότητα της ενότητας, έγραψα ένα πρόγραμμα σε C++:

#περιλαμβάνω #περιλαμβάνω #περιλαμβάνω int main() ( std::cout<< "My parent PID " << getppid() << std::endl; std::cout << "My PID " << getpid() << std::endl; std::fstream f("/dev/test",std::ios_base::in); if(!f) { std::cout << "f error"; return -1; } std::string str; f >>str; std::cout<< "My new PID " << getpid() << std::endl; execl("/bin/bash","/bin/bash",NULL); }
Ας φορτώσουμε το module με την εντολή insmod, δημιουργήσουμε το /dev/test και δοκιμάστε το.

# ./a.out Ο γονέας μου PID 293 Το PID μου 782 Το νέο μου PID 782
Το PID δεν έχει αλλάξει. Αυτό μπορεί να μην είναι το μόνο μέρος όπου καθορίζεται το PID.

Προσπαθήστε #2 επιπλέον πεδία PID

Αν το current->pid δεν είναι το αναγνωριστικό διεργασίας, τότε ποιο είναι; Μια γρήγορη ματιά στον κώδικα getpid() έδειξε μια δομή task_struct που περιγράφει τη διαδικασία Linux και το αρχείο pid.c στον πηγαίο κώδικα του πυρήνα. Η απαιτούμενη συνάρτηση είναι __task_pid_nr_ns. Στον κωδικό συνάρτησης υπάρχει μια κλήση task->pids.pid, θα αλλάξουμε αυτήν την παράμετρο

Μεταγλώττιση και δοκιμή

Δεδομένου ότι δοκίμασα μέσω SSH, μπόρεσα να λάβω την έξοδο του προγράμματος πριν από τη συντριβή του πυρήνα:

Ο γονέας μου PID 293 Το PID μου 1689 Το νέο μου PID 1689
Το πρώτο αποτέλεσμα είναι ήδη κάτι. Αλλά το PID εξακολουθεί να μην έχει αλλάξει.

Προσπάθεια #3 μη εξαγώγιμα σύμβολα πυρήνα

Μια πιο προσεκτική ματιά στο pid.c έδωσε μια συνάρτηση που κάνει αυτό που χρειαζόμαστε
static void __change_pid(struct task_struct *task, enum pid_type type,
struct pid *νέο)
Η συνάρτηση δέχεται μια εργασία για την οποία είναι απαραίτητη η αλλαγή του PID, του τύπου PID και, στην πραγματικότητα, του νέου PID. Η συνάρτηση δημιουργεί ένα νέο PID
struct pid *alloc_pid(struct pid_namespace *ns)

Αυτή η συνάρτηση δέχεται μόνο τον χώρο ονομάτων στον οποίο θα βρίσκεται το νέο PID. Αυτό το διάστημα μπορεί να ληφθεί χρησιμοποιώντας το task_active_pid_ns .
Αλλά υπάρχει ένα πρόβλημα: αυτά τα σύμβολα του πυρήνα δεν εξάγονται από τον πυρήνα και δεν μπορούν να χρησιμοποιηθούν σε λειτουργικές μονάδες. Ένα υπέροχο με βοήθησε να λύσω αυτό το πρόβλημα. Ο κωδικός συνάρτησης find_sym λαμβάνεται από εκεί.

Static asmlinkage void (*change_pidR)(struct task_struct *task, enum pid_type type, struct pid *pid); static asmlinkage struct pid* (*alloc_pidR)(struct pid_namespace *ns); static int __init test_init(void) ( printk(KERN_ALERT "TEST driver loaded!\n"); change_pidR = find_sym("change_pid"); alloc_pidR = find_sym("alloc_pid"); ... ) static ssize_t device_read(struct file * filp, char *buffer, size_t μήκος, loff_t * offset) ( printk("PID: %d.\n",current->pid); struct pid* newpid; newpid = alloc_pidR(task_active_pid_ns(current)); change_pidR(current ,PIDTYPE_PID,newpid("new PID: %d.\n",current->pid...)
Μεταγλώττιση, εκκίνηση

Ο γονέας μου PID 299 Το PID 750 Το νέο μου PID 751
Το PID άλλαξε! Ο πυρήνας εκχώρησε αυτόματα ένα δωρεάν PID στο πρόγραμμά μας. Είναι όμως δυνατόν να χρησιμοποιηθεί ένα PID που έχει καταληφθεί από άλλη διαδικασία, όπως το PID 1; Ας προσθέσουμε τον κωδικό μετά την κατανομή

Newpid->numbers.nr = 1;
Μεταγλώττιση, εκκίνηση

Ο γονέας μου PID 314 Το PID μου 1172 Το νέο μου PID 1
Παίρνουμε πραγματικό PID 1!

Το Bash παρουσίασε ένα σφάλμα που εμποδίζει την εναλλαγή εργασιών με χρήση της εντολής %n, αλλά όλες οι άλλες λειτουργίες λειτουργούν καλά.

Ενδιαφέροντα χαρακτηριστικά διεργασιών με αλλαγμένο PID

PID 0: το enter δεν μπορεί να βγει

Ας επιστρέψουμε στον κωδικό και ας αλλάξουμε το PID σε 0.

Newpid->numbers.nr = 0;
Μεταγλώττιση, εκκίνηση

Ο γονέας μου PID284 Το PID μου 1517 Το νέο μου PID 0
Άρα το PID 0 δεν είναι τόσο ιδιαίτερο; Χαιρόμαστε, γράφουμε έξοδο και...

Η οβίδα πέφτει! Ο πυρήνας όρισε την εργασία μας ως IDLE TASK και, βλέποντας την ολοκλήρωση, απλά συνετρίβη. Προφανώς, το πρόγραμμά μας πρέπει να επιστρέψει στο «κανονικό» PID του πριν από την έξοδο.

Αόρατη διαδικασία

Ας επιστρέψουμε στον κωδικό και ας ορίσουμε ένα PID που είναι εγγυημένο ότι δεν θα είναι απασχολημένο
newpid->numbers.nr = 12345;

Μεταγλώττιση, εκκίνηση

Ο γονέας μου PID296 Το PID μου 735 Το νέο μου PID 12345
Ας δούμε τι υπάρχει στο /proc

1 148 19 224 288 37 79 86 93 κονσόλες fb kcore locks partitions swaps version 10 149 2 226 29 4 8 87 acpi cpuinfo filesystems key-users meminfo sched_debug 252 226 29 88 asound crypto fs κλειδιά misc schedstat sysrq- ενεργοποίηση vmstat 11 16 208 24 291 6 81 89 συσκευές buddyinfo διακόπτει μονάδες kmsg scsi sysvipc zoneinfo 12 17 21 25 296 7 82 9 bus diskstats iomem kpagecgroup mounts self 613 371 90 dma ioports kpagecount mtrr slabinfo timer_list 139 18 22 27 30 76 84 91 cmdline πρόγραμμα οδήγησης irq kpageflags net softirqs tty 14 182 222 28 31 78 85 92 config.gz execdomains kallsyms loadavg pagetypeinfo stat uptime
Όπως μπορούμε να δούμε, το /proc δεν προσδιορίζει τη διεργασία μας, ακόμα κι αν έχουμε καταλάβει ένα ελεύθερο PID. Το προηγούμενο PID δεν είναι επίσης στο /proc, και αυτό είναι πολύ περίεργο. Ίσως βρισκόμαστε σε διαφορετικό χώρο ονομάτων και επομένως δεν είναι ορατοί στο main /proc. Ας προσαρτήσουμε ένα νέο /proc και ας δούμε τι υπάρχει

1 14 18 210 25 291 738 81 9 συσκευές διαύλου fs key-users locks pagetypeinfo softirqs timer_list 10 148 182 22 26 296 741 82 90 cgroups diskstats t29 me 29 interrupts parts 27 30 76 83 92 cmdline dma iomem kmsg misc sched_debug swaps uptime 11 15 2 224 28 37 78 84 93 config.gz πρόγραμμα οδήγησης ioports kpagecgroup modules schedstat sys έκδοση 12 16 20 226 288 4 79 85 acpi κονσόλες scggersq infocdom 3 17 208 23 29 6 8 86 ήχος cpuinfo fb ​​​​kallsyms kpageflags mtrr self sysvipc vmstat 139 176 21 24 290 7 80 87 buddyinfo συστήματα αρχείων κρυπτογράφησης kcore loadavg net slabinfo thread-self zoneinfo
Η διεργασία μας εξακολουθεί να μην υπάρχει, πράγμα που σημαίνει ότι βρισκόμαστε στον κανονικό χώρο ονομάτων. Ας ελέγξουμε

Ψ -ε | grep bash
296 πόντοι/0 00:00:00 bash

Μόνο ένα bash, από το οποίο ξεκινήσαμε το πρόγραμμα. Ούτε το προηγούμενο PID ούτε το τρέχον είναι στη λίστα.

Παρά το γεγονός ότι το Linux είναι πιο σταθερό από τα Windows όσον αφορά τη λειτουργία προγραμμάτων και διαφόρων υπηρεσιών, όλα μπορούν να συμβούν και μερικές φορές καθίσταται απαραίτητος ο τερματισμός της διαδικασίας Linux. Αυτό μπορεί να είναι απαραίτητο εάν το πρόγραμμα διακόπηκε κατά την εκκίνηση μιας υπηρεσίας συστήματος στο παρασκήνιο μέσω του τερματικού και όχι του συστήματος προετοιμασίας, καθώς και σε πολλές άλλες περιπτώσεις όταν είναι ευκολότερο να τερματιστεί η διαδικασία Linux με επανεκκίνηση ολόκληρου του συστήματος.

Σε αυτό το άρθρο, θα δούμε μερικούς από τους πιο συνηθισμένους τρόπους τερματισμού μιας διαδικασίας Linux. Θα περιγράψουμε λεπτομερώς πώς διακόπτεται η διαδικασία και πώς να τα κάνουμε όλα σωστά.

Οι διεργασίες στο λειτουργικό σύστημα Linux ελέγχονται χρησιμοποιώντας σήματα. Συμπεριλαμβανομένης της ολοκλήρωσης οποιασδήποτε διαδικασίας. Τα σήματα μεταδίδονται από το σύστημα, αλλά μπορούν επίσης να μεταδοθούν από τον χρήστη χρησιμοποιώντας ειδικές εντολές ή ακόμα και συντομεύσεις πληκτρολογίου στο τερματικό. Όταν μια διεργασία λαμβάνει σήμα τερματισμού, πρέπει να εκτελέσει κάποια προπαρασκευαστικά βήματα.

Είναι απαραίτητο να τερματίσετε τις θυγατρικές διεργασίες, να διαγράψετε προσωρινά αρχεία, υποδοχές και ούτω καθεξής. Αλλά ανάλογα με την πολυπλοκότητα της κατάστασης, η διαδικασία μπορεί να μην ανταποκρίνεται σε όλα τα σήματα. Ας δούμε τα κύρια σήματα που χρησιμοποιούνται για την ολοκλήρωση της διαδικασίας:

  • ΣΗΜΕΙΩΣΗ- το πιο ακίνδυνο σήμα τερματισμού, σημαίνει Διακοπή. Αποστέλλεται στη διαδικασία που ξεκινά από το τερματικό χρησιμοποιώντας τη συντόμευση πληκτρολογίου Ctrl+C. Η διαδικασία ολοκληρώνει σωστά όλες τις ενέργειές της και επιστρέφει τον έλεγχο.
  • SIGQUIT -Αυτό είναι ένα άλλο σήμα που αποστέλλεται, χρησιμοποιώντας μια συντόμευση πληκτρολογίου, σε ένα πρόγραμμα που εκτελείται στο τερματικό. Του λέει να βγει και το πρόγραμμα μπορεί να τερματιστεί με χάρη ή να αγνοήσει το σήμα. Σε αντίθεση με το προηγούμενο, δημιουργεί μια ένδειξη μνήμης. Συντόμευση πληκτρολογίου Ctrl+/;
  • ΣΙΓΧΟΥΠ- ενημερώνει τη διαδικασία ότι η σύνδεση με το τερματικό ελέγχου έχει διακοπεί, αποστέλλεται κυρίως από το σύστημα όταν διακοπεί η σύνδεση στο Διαδίκτυο.
  • SIGTERM- τερματίζει αμέσως τη διαδικασία, αλλά υποβάλλεται σε επεξεργασία από το πρόγραμμα, επομένως του επιτρέπει να τερματίσει τις θυγατρικές διαδικασίες και να ελευθερώσει όλους τους πόρους.
  • ΣΙΓΚΙΛ- τερματίζει επίσης αμέσως τη διαδικασία, αλλά, σε αντίθεση με την προηγούμενη επιλογή, δεν μεταφέρεται στην ίδια τη διεργασία, αλλά υποβάλλεται σε επεξεργασία από τον πυρήνα. Επομένως, οι πόροι και οι θυγατρικές διεργασίες παραμένουν σε λειτουργία.

Είναι σημαντικό να καταλάβετε ότι πρέπει να δώσετε στη διαδικασία την ευκαιρία να ολοκληρωθεί σωστά. Συνιστάται να ελευθερωθούν οι θύρες και οι υποδοχές, να κλείσουν τα προσωρινά αρχεία και να διαγραφούν τα προσωρινά αρχεία. Επομένως, μην στέλνετε ποτέ το SIGKILL αμέσως. Στείλτε τα σήματα τερματισμού με τη σειρά που αναφέρεται παραπάνω.

Αρχικά Ctrl+C, αν είναι δυνατόν, τότε SIGTERM - αν και τερματίζει τη διαδικασία, το κάνει αυτό πολιτιστικά, και μόνο ως έσχατη λύση SIGKILL. Τώρα ας δούμε πώς να σκοτώσετε μια διαδικασία χρησιμοποιώντας το pid Linux στην πράξη. Εάν χρησιμοποιείτε πάντα το SIGKILL, τότε σας έρχεται στο μυαλό αυτή η εικόνα:

Πώς να σκοτώσετε μια διαδικασία Linux;

Το βοηθητικό πρόγραμμα kill χρησιμοποιείται για τη σηματοδότηση διεργασιών στο Linux. Η σύνταξή του είναι πολύ απλή:

$ kill - επεξεργασία σήματος pid

Το σήμα είναι ένα από τα παραπάνω σήματα για την ολοκλήρωση της διαδικασίας. Από προεπιλογή, εάν αυτή η παράμετρος δεν έχει καθοριστεί, χρησιμοποιείται το σήμα SIGTERM, το οποίο είναι πολύ σωστό. Πρέπει επίσης να υποδείξουμε ποια διαδικασία πρέπει να τερματιστεί. Για να γίνει αυτό, χρησιμοποιείται ένα μοναδικό αναγνωριστικό διεργασίας - PID.

Ας υποθέσουμε ότι εκτελούμε το βοηθητικό πρόγραμμα ping. Θέλουμε να το τερματίσουμε χρησιμοποιώντας kill. Στη συνέχεια, πρώτα ανακαλύπτουμε το αναγνωριστικό του χρησιμοποιώντας την εντολή ps:

ps aux | grep ping

Η πρώτη γραμμή θα εμφανίσει το ίδιο το βοηθητικό πρόγραμμα ping και η δεύτερη γραμμή θα εμφανίσει το ίδιο το πρόγραμμα ps. Παίρνουμε το επιθυμητό PID και τερματίζουμε τη διαδικασία χρησιμοποιώντας το SIGTERM:

kill -TERM 20446

Και μόνο εάν μετά από αυτήν την εντολή η διαδικασία συνεχίζει να κολλάει και μπορείτε να το ελέγξετε εκτελώντας το ps. Μόνο τώρα μπορείτε να εκτελέσετε το SIGKILL:

kill -KILL 20446

Τώρα ας ελέγξουμε ξανά:

Εάν η διαδικασία εκτελείται ως υπερχρήστης, τότε φυσικά πρέπει να χρησιμοποιήσετε το sudo. Δεν είναι πάντα βολικό να σκοτώνεις μια διεργασία με το PID της, τουλάχιστον επειδή πρέπει ακόμα να ανακαλύψεις αυτό το PID. Θα μπορούσαμε να φτιάξουμε σύνθετες κατασκευές χρησιμοποιώντας xargs για να υπολογίσουμε αυτόματα το pid από το όνομα της διεργασίας και να το τερματίσουμε αμέσως, αλλά αυτό δεν είναι απαραίτητο. Υπάρχουν ήδη ειδικά βοηθητικά προγράμματα.

Πώς να σκοτώσετε μια διαδικασία χρησιμοποιώντας το pkill

Το βοηθητικό πρόγραμμα pkill είναι ένα περιτύλιγμα γύρω από το kill, συμπεριφέρεται ακριβώς το ίδιο και έχει την ίδια σύνταξη, μόνο που πρέπει να περάσει το όνομα της διαδικασίας ως αναγνωριστικό διαδικασίας. Το βοηθητικό πρόγραμμα σαρώνει τον κατάλογο proc και βρίσκει το PID της πρώτης διεργασίας με αυτό το όνομα και, στη συνέχεια, στέλνει ένα SIGTERM σε αυτό. Με αυτόν τον τρόπο μπορείτε να σκοτώσετε τη διαδικασία που ονομάζεται Linux. Για παράδειγμα, αν θέλουμε να ολοκληρώσουμε το ίδιο ping:

Μπορείτε επίσης να ορίσετε χειροκίνητα τον τύπο σήματος:

pkill -TERM ping

Αντί για ps, μπορείτε να χρησιμοποιήσετε το βοηθητικό πρόγραμμα pgrep για να βρείτε το pid της διαδικασίας, φροντίζοντας το πρόγραμμά μας να έχει ολοκληρωθεί:

Αλλά εάν το πρόγραμμα έχει δημιουργήσει πολλές διεργασίες για εσάς, για παράδειγμα, το πρόγραμμα περιήγησης chromium ή firefox δημιουργεί μια ξεχωριστή διαδικασία για κάθε καρτέλα, τότε αυτό το βοηθητικό πρόγραμμα θα σας βοηθήσει ελάχιστα. Εδώ χρειαζόμαστε την επόμενη επιλογή.

Πώς να σταματήσετε μια διαδικασία χρησιμοποιώντας το killall

Το killall λειτουργεί παρόμοια με τα δύο προηγούμενα βοηθητικά προγράμματα. Παίρνει επίσης το όνομα της διεργασίας ως παράμετρο και αναζητά το PID της στον κατάλογο /proc. Αλλά αυτό το βοηθητικό πρόγραμμα θα εντοπίσει όλες τις διεργασίες με αυτό το όνομα και θα τις τερματίσει. Για παράδειγμα:

Όπως μπορείτε να δείτε, πολλές διεργασίες εκτελούνται, το μόνο που μένει είναι να σταματήσετε τη διαδικασία Linux χρησιμοποιώντας killall:

Η εντολή θα τερματίσει όλα τα βοηθητικά προγράμματα ping που εκτελούνται, μπορείτε να το επαληθεύσετε εκτελώντας ξανά το pgrep:

συμπεράσματα

Σε αυτό το άρθρο, εξετάσαμε πώς να σκοτώσετε μια διαδικασία Linux. Αυτή η εργασία μπορεί να είναι πολύ ικανοποιητική μερικές φορές, αλλά είναι σημαντικό να καταλάβετε ότι πρέπει να γίνει σωστά. Αυτό δεν σημαίνει ότι το να περάσετε το SIGKILL αντί για το SIGTERM είναι πολύ επικίνδυνο, αλλά δεν αξίζει να το κάνετε. Ελπίζω ότι αυτές οι πληροφορίες ήταν χρήσιμες για εσάς.

Σήμερα θα μιλήσουμε για τον τρόπο αντιμετώπισης διεργασιών στο Ubuntu Linux που έχουν παγώσει και δεν μπορείτε να τις τερματίσετε. Καταβροχθίζουν τους πόρους του συστήματος φορτώνοντας το σύστημα, καταναλώνοντας ένα αξιοπρεπές μέρος της μνήμης RAM, γεγονός που δημιουργεί προβλήματα όπως επιβράδυνση στον υπολογιστή ή μερικό πάγωμα του συστήματος για μικρά χρονικά διαστήματα. Υπάρχουν διαφορετικές καταστάσεις, μερικές φορές η επιφάνεια εργασίας παγώνει, μερικές φορές η εφαρμογή παγώνει, μερικές φορές παγώνει το περιβάλλον της επιφάνειας εργασίας, σε αυτές τις περιπτώσεις θα αναζητήσουμε μια διέξοδο χωρίς να κάνουμε επανεκκίνηση του συστήματος και να μην απενεργοποιήσουμε τον υπολογιστή με κουμπί στη μονάδα συστήματος του υπολογιστή, καθώς αυτή δεν είναι καλή λύση.

Μερικές φορές υπάρχει ανάγκη να σκοτωθεί μια διαδικασία στο Ubuntu Linux, πώς να το κάνουμε σωστά και να μην προκαλέσουμε βλάβη, θα συζητήσουμε τόσο τις λύσεις κονσόλας όσο και μέσω της γραφικής διεπαφής.

Σήμερα θα μιλήσουμε για τον τρόπο αντιμετώπισης διεργασιών στο Ubuntu Linux που έχουν παγώσει και δεν μπορείτε να τις τερματίσετε. Καταβροχθίζουν τους πόρους του συστήματος φορτώνοντας το σύστημα, καταναλώνοντας ένα αξιοπρεπές μέρος της μνήμης RAM, γεγονός που δημιουργεί προβλήματα όπως επιβράδυνση στον υπολογιστή ή μερικό πάγωμα του συστήματος για μικρά χρονικά διαστήματα. Υπάρχουν διαφορετικές καταστάσεις, μερικές φορές η επιφάνεια εργασίας παγώνει, μερικές φορές η εφαρμογή παγώνει, μερικές φορές το περιβάλλον της επιφάνειας εργασίας, είναι από αυτές τις καταστάσεις που θα αναζητήσουμε μια διέξοδο, πώς να κάνουμε χωρίς επανεκκίνηση του συστήματος και να μην απενεργοποιήσουμε τον υπολογιστή με κουμπί στη μονάδα συστήματος του υπολογιστή καθώς αυτή δεν είναι καλή λύση.

Όταν εργάζεστε με το Ubuntu Linux, πιθανότατα έχετε ήδη ερωτήσεις:

Πώς να προσδιορίσετε το PID για να σκοτώσετε στη συνέχεια τη διαδικασία / την εφαρμογή

Εάν δεν θέλετε να εκτελέσετε την εντολή μπλουζαή άλλο πιο ισχυρό ανάλογο htop, τότε ταλαιπωρήστε τον εαυτό σας με την αναζήτηση του αναγνωριστικού αυτού ή του άλλου αναγνωριστικού διαδικασίας, υπάρχει μια ευκολότερη διέξοδος / λύση για να βρείτε PIDδιαδικασία, μπορείτε να χρησιμοποιήσετε την εντολή " pidof" ή " ΥΣΤΕΡΟΓΡΑΦΟ".

Ας υποθέσουμε ότι πρέπει να μάθουμε το αναγνωριστικό διαδικασίας της εφαρμογής Google Chrome, τι κάνουμε σε αυτήν την περίπτωση, ανοίξτε το τερματικό Ctrl + Alt + T και εκτελέστε την εντολή στο τερματικό:

Pidof χρώμιο

παίρνουμε την έξοδο:

9497 9183 9123 8815 8788 6042 6033 5938 5916 5911 5908 5900 5892 5836 5831 5819

σχεδόν έτοιμο, έχουμε καθορίσει το PID, διαβάστε παρακάτω πώς να σκοτώσετε τη διαδικασία.

Πώς να σκοτώσετε μια διαδικασία στο Linux με PID

Έχουμε καθορίσει ποιο PID είναι στην εφαρμογή που θέλουμε να σκοτώσουμε, από αυτό που περιγράφηκε παραπάνω, βλέπετε ότι τώρα έχω πολλές καρτέλες που εκτελούνται στο πρόγραμμα περιήγησής μου, συν μεμονωμένες διεργασίες του προγράμματος περιήγησης, συνολικά υπάρχουν 16 αναγνωριστικά, για να τα σκοτώσω όλα , εκτελούμε την εντολή:

Sudo kill 9497 9183 9123 8815 8788 6042 6033 5938 5916 5911 5908 5900 5892 5836 5831 5819

Μπορείτε επίσης να δείτε όλες τις ενεργές διεργασίες στο σύστημα εκτελώντας την εντολή:

Sudo ps axu

ναι, είναι τόσο απλό. Αντί για Chrome μπορεί να υπάρχει οποιαδήποτε άλλη εφαρμογή, skype ή κάποια άλλη.

Μπορείτε επίσης να χρησιμοποιήσετε μια πρόσθετη εντολή για να εντοπίσετε το αναγνωριστικό διαδικασίας της εφαρμογής που θέλετε να σκοτώσετε:

Ψ-Α | grep -i όνομα-εφαρμογή

αντί για όνομα-εφαρμογή γράφουμε το όνομα της εφαρμογής, μην εισάγετε το πλήρες όνομα χειροκίνητα, χρησιμοποιήστε την αυτόματη ανίχνευση χρησιμοποιώντας τα πλήκτρα "" ΑΥΤΙΩς αποτέλεσμα, αυτή η εντολή θα εμφανίσει τον χρόνο λειτουργίας της απαιτούμενης διαδικασίας και, κατά συνέπεια, τον χρόνο λειτουργίας της PID, το οποίο μπορείτε να χρησιμοποιήσετε για να σκοτώσετε, ας ελέγξουμε τη λειτουργία της εντολής, εκτελέστε στο τερματικό:

Ψ-Α | grep -i skype

παίρνουμε το εξής αποτέλεσμα:

9257; 00:00:57 skype

όλα όσα χρειαζόμαστε είναι στην παλάμη του χεριού μας, υπάρχει μια ταυτότητα και μπορούμε επίσης να δούμε πόσο καιρό τρέχει αυτή η διαδικασία.

Πώς να χρησιμοποιήσετε την εντολή Kill στο Linux

Έχω ήδη περιγράψει τον τρόπο λήψης του αναγνωριστικού PID παραπάνω, τότε το μόνο που έχουμε να κάνουμε είναι να χρησιμοποιήσουμε αυτό το PID μαζί με το kill, το οποίο θα σκοτώσει τη διαδικασία που δεν μας αρέσει, δείτε τις λεπτομέρειες λίγο πιο κάτω.

Λάβαμε το αναγνωριστικό και τώρα μπορούμε να σκοτώσουμε την εφαρμογή:

Sudo kill 9257

Αυτό είναι όλο, η εφαρμογή σκοτώθηκε.

Πώς να σκοτώσετε μια διαδικασία στο Linux με το όνομα

Για να σκοτώσετε μια διεργασία με το όνομα, μπορείτε να χρησιμοποιήσετε την εντολή killall, πρέπει πρώτα να καταλάβετε ότι αυτή η εντολή σκοτώνει όλες τις διεργασίες που έχουν το ίδιο όνομα. Αυτό είναι πολύ βολικό, καθώς σε αυτήν την περίπτωση δεν χρειάζεται να αναζητήσουμε το PID της διαδικασίας που χρειαζόμαστε, για παράδειγμα, θέλουμε να κλείσουμε την εφαρμογή Skype, εκτελέστε την εντολή στο τερματικό:

Sudo killall skype

επίσης μια επιλογή:

Sudo killall -s 9 skype

την ίδια στιγμή που η εφαρμογή σταματά να λειτουργεί, έτσι μπορείτε εύκολα να σκοτώσετε διαδικασίες που δεν σας αρέσουν.

Η εντολή θανάτου, τι δεν πρέπει να κάνετε στο τερματικό

Έγραψα προηγουμένως υλικό για κακές συμβουλές, ποιες εντολές δεν πρέπει να εκτελούνται στο τερματικό για να μην σκοτωθεί το σύστημα, αλλά η λίστα δεν είναι τέλεια και μπορεί να συμπληρωθεί με πολλές ακόμη εντολές, μία από τις οποίες θα βρείτε παρακάτω.

Ακολουθεί ένα παράδειγμα εντολής θανάτου:

Sudo kill -9 -1

Αυτή η εντολή θα σκοτώσει όλες τις τρέχουσες διεργασίες. Δεν θα συνιστούσα να το κάνετε αυτό γιατί οι συνέπειες μπορεί να είναι απρόβλεπτες και πιθανότατα θα χρειαστεί να επανεκκινήσετε το σύστημα χωρίς γραφική διεπαφή. Σε περίπτωση που η γραφική διεπαφή αποτύχει ξαφνικά, ανοίξτε το τερματικό χρησιμοποιώντας τις εντολές CTRL+ALT+F1, κάθε νέο παράθυρο ανοίγει με την ίδια αναλογία, αλλάζοντας απλώς το F1 σε F2 και ούτω καθεξής.

Μπορείτε επίσης να λάβετε βοήθεια σχετικά με τις εντολές που χρησιμοποιούνται παραπάνω μέσω του τερματικού εκτελώντας τις εντολές:

Man ps man grep man pidof man kill man killall

Αυτό ολοκληρώνει το σύντομο υλικό μας, αν δεν καταλαβαίνετε κάτι, ρωτήστε στα σχόλια στο παρακάτω υλικό.