2014-05-02 3 views
1

Pour célébrer ma période de probation de 3 mois en tant que développeur web concluant, je vais faire un gâteau terminal pour le bureau. Dans mes recherches sur le sujet, je suis tombé sur cette photo, et je me demandais ce que les commandes font?Que font les commandes de ce gâteau?

cake picture

+1

Ils sont supposés arrêter tout processus 'httpd' (serveur web) sur la machine. Mais la commande est cassée. : - \ –

+2

Eh bien, les valeurs passées à 'kill -9' incluront plus que de simples identifiants de processus, mais à moins que certains d'entre eux ne soient des PID valides, ils imprimeront juste un tas de messages d'erreur et tueront les processus. (Mais sur mon système, où j'exécute Apache, les processus du serveur web s'appellent 'apache2', pas' httpd'.) –

+0

Merci à tous les deux, ma curiosité a été repoussée! J'ai supposé que cela aurait pu être quelque chose dans ce sens. – okeegan

Répondre

5

Ce pipeline essaye d'arrêter tous les processus d'Apache sur le système, dans un assez lourd la mode Rube Goldbergian.

Le pipeline:

  1. Obtient une liste de tous les processus du système. (ps axww)

    Cette méthode est un dépassement, fournissant plus de données que nécessaire pour atteindre l'extrémité souhaitée, ce qui causera des problèmes plus tard.

  2. Recherche les lignes contenant httpd, qui est un nom de processus commun pour le serveur Web Apache. Il pourrait correspondre à d'autres choses accidentellement, mais sur une machine qui est supposée être simplement un serveur web, c'est assez sûr.

    Vous obtenez des lignes comme celle-ci de ce stade:

    17652 ?  Ss  0:00 /usr/bin/httpd -blah -args 
    

    Le pipeline correspondrait à une commande vi /etc/httpd/conf.d/mime.conf aussi.

  3. Filtre les lignes contenant grep (grep -v grep) parce que le premier grep trouveront également se:

    24180 pts/0 R+  0:00 grep httpd 
    

    Si vous ne filtrent pas cette ligne, vous risquez de tuer le premier grep par exemple avant la fin du pipeline, brisant ainsi le pipeline. ps sous Linux trie sa sortie par PID par défaut, de sorte que PIDs wrap around, grep peut apparaître avant httpd, ce qui fait que la commande cake n'a aucun effet.

  4. Utilise xargs pour exécuter kill -9 sur chaque ligne trouvée.

    C'est, il construit des commandes comme celle-ci et les exécute:

    kill -9 17652 ?  Ss  0:00 /usr/bin/httpd -blah -args 
    

    Cela peut ou ne peut pas faire ce que vous voulez. Il peut parfois fonctionner car l'ID de processus (PID) est la première chose sur la ligne lorsque vous exécutez ps avec les indicateurs axww. (Il y a d'autres façons d'exécuter ps où la première chose sur la ligne est quelque chose d'autre.Le décorateur de gâteaux espère que l'implémentation de kill sur le système ne barfera pas quand il obtiendra tous les autres indésirables suivant le PID sur la ligne de sortie . Ce que fait kill(1) avec des arguments non-PID. Il pourrait s'arrêter au premier argument non numérique, il pourrait donner des erreurs pour chaque argument trouvé, ou il pourrait les ignorer silencieusement. Si la ligne trouvée par ps contient des nombres qui sont des PID valides, la commande sur le gâteau pourrait finir par tuer des processus que vous n'aviez pas prévus.

Il serait beaucoup mieux d'utiliser pgrep ici, si elle est disponible:

# pgrep httpd | xargs kill -9 

Non seulement la commande plus courte, il fait ce que vous voulez réellement, de manière fiable. Il ne correspond pas, puis filtre les processus grep, il ne correspond que sur le nom du processus, et il ne transmet pas de courrier indésirable non-PID à kill.

Systems avec pgrep ont souvent aussi la commande pkill, qui se termine ce pipeline en une seule commande:

# pkill httpd 

Vous pouvez ajouter ici pour mettre fin à la force httpd processus si vous voulez, mais je vais laisser à partir d'ici. J'ai ordonné à ces commandes d'être de plus en plus discriminantes, donc il est également logique de les rendre de façon moins brutale, si vous voulez.

Si votre système n'a pas pgrep ou pkill, il peut avoir pidof:

# kill $(pidof httpd) 

Une autre méthode consiste à utiliser killall:

# killall httpd 

Prenez garde, la commande killall peut faire something different sur des systèmes d'exploitation non-Linux.

La méthode la plus sûre consiste à utiliser la commande "Arrêter le serveur Web" normale de votre système d'exploitation. Exemples:

# service httpd stop 
# /etc/init.d/httpd stop 
# systemctl stop httpd.service 
# launchctl unload /System/Library/LaunchDaemons/org.apache.httpd.plist 

Apache comprend une commande "arrêter Apache bien":

# apachectl stop 

Cette commande ne cependant bon, Apache arrêter. Les commandes spécifiques au système d'exploitation ci-dessus peuvent également effectuer d'autres actions de nettoyage. Si Apache a été démarré par le système d'exploitation, vous devez également utiliser la commande du système d'exploitation pour l'arrêter.

-1

Ceci est une commande gâteau de protection. Cette commande empêche un root de manger le gâteau, car après cela les utilisateurs fâchés appellent la racine, ouvrent les tickets de panne, etc. :)

+0

Est-ce que 'incapable' peut être 'activer' ou 'désactiver' ou quelque chose d'autre? –

Questions connexes