-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcap5.tex
executable file
·1627 lines (1431 loc) · 83.6 KB
/
cap5.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
\chapter{Administrando o sistema}
O sistema GNU/Linux é um sistema operacional multi-usuário e
multi-tarefa, o que torna muito importante e ocasionalmente complexa a
sua administração. O objetivo desse tópico é que você conheça o básico
da administração de um sistema GNU/Linux, basicamente operando em três
frentes:
\begin{itemize}
\item Administração de usuários: criar, modificar as senhas e eliminar
usuários e grupos;
\item Administração de processos: entender o que são processos,
identificar processos no sistema e eliminar processos estranhos;
\item \emph{Backup}: Entender a importância de um \emph{backup},
conhecer os utilitários envolvidos no \emph{backup} do sistema,
criar e recuperar um \emph{backup};
\end{itemize}
Essas operações são todas feitas como super-usuário(\texttt{root}),
portanto toda cautela é pouca: basta um erro para causar instabilidade
no sistema ou colocar todo o seu sistema fora do ar. Por isso, estude
esse capítulo com calma que tudo dará certo.
Esse capítulo deve ser enxergado como uma introdução à administração
do GNU/Linux. Para aqueles que desejam se aprofundar no assunto, o
conselho (após a leitura dessa apostila) é estudar o Guia FOCA
GNU/Linux, Nível Avançado\cite{FOCALINUX-ADV2005}, ou o \emph{The
Linux System Administrators' Guide}\cite{SAG2005}, além de poder-se
estudar algum dos diversos livros disponíveis em boas livrarias
técnicas.
\section{Criando usuários: \texttt{adduser}}
\label{sec:adduser}
Como já cansamos de dizer nesse documento, o GNU/Linux é um sistema
multi-usuário, o que quer dizer que você precisa de um nome de usuário
para entrar nele, como dissemos no Capítulo \ref{cap:iniciando},
quando comentamos a filosofia do GNU/Linux (Seção
\ref{sec:filosofiaLinux}, Página \pageref{sec:filosofiaLinux}) e
quando comentamos o processo de \emph{login} no sistema (Seção
\ref{sec:login}, Página \pageref{sec:login}). Naquele caso, você
provavelmente deve ter usado ou a conta \texttt{root} (tomando os
devidos cuidados) ou uma conta de usuário especialmente criada pelo
administrador do sistema\footnote{para um curso como esse, seria
aconselhável o usuário \texttt{guest}, senha \texttt{guest}}. Agora
que conhecemos todas as questões envolvidas com o sistema de
permissões de acesso e afins e como os usuários são afetados por isso,
podemos agora ver o processo envolvido com a criação de uma conta de
um usuário.
Ao criar uma conta de usuário no GNU/Linux, basicamente faz-se quatro
coisas:
\begin{enumerate}
\item Dá-se um nome de usuário ao mesmo, associando um UID (\emph{User
Identification}) numérico ao mesmo a ser usado pelo sistema
internamente;
\item Estabelece-se uma senha para acessar-se o sistema com a conta de
usuário em questão;
\item Associa-se o usuário a um grupo de usuários (podendo ser
inclusive --- e esse é o padrão do GNU/Linux --- um grupo do ``eu
sozinho'', ao qual apenas o usuário faz parte), identificado através
de um UID (\emph{Group Identification}) numérico;
\item Cria-se e associa-se ao usuário um diretório de uso pessoal, o
diretório \emph{home}, já comentado Cápitulo \ref{sec:dirgnulinux},
na Seção \ref{sec:homedir}, Página \pageref{sec:homedir};
\end{enumerate}
Esse processo pode ser feito de várias maneiras, inclusive pela edição
manual de arquivos de configuração e cópias de arquivos necessários
(demonstrada no Capítulo 11 do \emph{The Linux System Administrators'
Guide}\cite{NEWUSER-SAG2005}), mas o GNU/Linux possui um comando que
facilita a vida do administrador, o comando \texttt{adduser}. Ele
realiza esse processo de maneira automatizada para o administrador,
com as opções corretas selecionadas. O comando padrão é
\texttt{adduser <usuario>}, mas esse comando em geral só cria a conta
do usuário sem senha e sem grupo ou \emph{home} associado (algumas
distros utilizam \emph{alias} aqui para que faça algumas dessas
funções de maneira mais automática). Por isso, é importante saber
quais as melhores opções a serem usadas.
No caso, vamos ver as opções mais úteis:
\begin{itemize}
\item \texttt{-disable-password}: não pede uma senha de imediato,
pedindo no momento em que o usuário se logar pela primeira vez no
sistema;
\item \texttt{-uid}: Define um UID específico ao usuário, ao invés de
simplesmente usar o próximo UID disponível no sistema. Isso pode ser
muito interessante quando você quer que um determinado usuário
reaproveite os arquivos de outro, mas deve-se ter cuidado com isso,
pois no caso de UIDs iguais as permissões dos dois usuários serão
iguais (o GNU/Linux usa os UID para as suas funções, e os nomes de
usuário são apenas uma referência fácil que a pessoa tem para saber
informações sobre o uso do sistema). Veremos mais sobre isso na
Seção \ref{sec:uidcaution}, Página \pageref{sec:uidcaution};
\item \texttt{-gid}: Especifica um GID arbitrário ao novo grupo do
usuário. Como no caso do UID, deve-se tomar cuidado, pois dois GIDs
iguais são considerados iguais no sistema, mesmo que os nomes dos
grupos sejam direferentes;
\item \texttt{--home}: Determina o diretório \emph{home} do
usuário. Muitas vezes, utiliza-se o padrão \texttt{/home/<usuario>}
como diretório \emph{home} do usuário, mas essa opção permite
definir arbitrariamente o \emph{home} do usuário. Isso pode ser
muito útil em sistemas cujo sistema de arquivos\footnote{dentro do
mundo GNU/Linux, algumas vezes os termos \emph{dispositivo} e
zemph{sistema de arquivos} podem ser usados de maneira
intercambiáveis} \texttt{/home} esteja lotado ou em níveis
críticos, podendo permitir que a conta seja criada em um sistema de
arquivos menos ocupado;
\item \texttt{-p}: define uma senha padrão para o usuário. Perceba que
essa opção não pode ser usada em conjunto com
\texttt{-disable-password};
\item \texttt{-s}: define o \emph{shell} do usuário. Uma coisa muito
interessante e que você pode definir como \emph{shell} do usuário
\emph{qualquer} programa em absoluto. Ou seja, se você quiser que um
determinado usuário acessa apenas o programa \texttt{workprog}, você
pode definir ele como o \emph{shell} do mesmo. Ele poderá acessar
apenas aquele programa e, ao sair do mesmo, será levado de volta ao
\emph{login}. Você pode até mesmo definir que o usuário \emph{não
terá um shell}. Isso é útil para servidores, criando ilhas de
segurança através de usuários sem \emph{shell}. Para isso, basta
apontar para \texttt{/dev/null} ou para os \emph{null shells}
(\emph{shells} nulos) \texttt{/bin/true} e \texttt{/bin/false}. Na
maioria dos sistemas GNU/Linux, o \emph{shell} padrão é o
\texttt{/bin/bash} (ou seu \emph{link} simbólico \texttt{/bin/sh});
\end{itemize}
Para mais opções, consulte a \emph{manpage} \texttt{adduser(8)}.
Vamos a um exemplo:
Imaginemos que queremos criar um usuário \texttt{adumbledore}, com o
\emph{home} em \texttt{/hogwarts/principal} e com a senha
\texttt{allflavorbeans}. O \emph{shell} será o padrão do sistema, e
aceitaremos o novo UID e GID. Para isso, utilizamos o comando
\texttt{adduser -p allflavorbeans --home /hogwarts/principal
adumbledore}. Toda vez que alguém digitar \texttt{~adumbledore}, irá
listar o conteúdo de \texttt{/hogwarts/principal} e para entrar como o
usuário \texttt{adumbledore} será necessário a senha
\texttt{allflavorbeans}.
\subsection{O cuidado com os UID}
\label{sec:uidcaution}
Uma coisa muito importante a tomar-se cuidado é com a questão dos
UID. O motivo desse é que, citando por \citeonline{NEWUSER-SAG2005},
``\emph{Na realidade, o kernel do Linux trata os usuários como simples
números}'': o uso de nomes de usuário em listagens de arquivos e no
\emph{login} são apenas meras conveniências do sistema para o acesso
facilitado a informações pelo usuário. Por isso, o UID deve ser um
identificador único.
O principal erro (e que pode ser \emph{muito} grave) é usar o mesmo
UID para dois usuários. Nesse caso, os dois usuários terão a mesma
permissão de acesso ao sistema. Isso é uma brecha de segurança séria,
e um dos principais modos de se criar um \emph{rootshell} é esse:
criar um usuário comum, ``inofensivo'' e, adulterando os arquivos de
configuração, definir seu UID para \texttt{0}(UID do \texttt{root}).
Reaproveitar UIDs de usuários removidos do sistema pode não ser também
uma boa idéia, pois o novo usuário passará a ser dono de todos os
arquivos do antigo dono. Mas isso pode também ser interessante:
imagine que um determinado usuário saiu da companhia e outro entrou em
seu lugar. Ao invés de ter um trabalho enorme mudando permissões e
configurando grupos, você pode simplesmente definir o UID do usuário
em questão para o do antigo usuário.
Por exemplo: imaginemos que nosso usuário \texttt{adumbledore} tenha
sido removido, e que criaremos um usuário \texttt{mmcgonagall}, que
terá acesso aos arquivos e dados manipulados por \texttt{adumbledore}.
Imaginemos que o UID de \texttt{adumbledore} seja 1024 e que o usuário
\texttt{mmcgonagall} terá como senha \texttt{animagus}. Podemos usar o
comando \texttt{adduser -p animagus --home /hogwarts/principal -uid
1024 mmcgonagall}. Isso \emph{automagicamente} tornaria
\texttt{mmcgonagall} o dono dos arquivos, diretórios, programas e do
diretório \emph{home} do antigo usuário \texttt{adumbledore}. Esse,
inclusive, pode ser um truque interessante para impedir que
ex-funcionários insatisfeitos roubem as informações com que
trabalhavam na empresa.
\subsection{O diretório \texttt{/etc/skel}}
Como dissemos na Seção \ref{sec:homedir}, Página
\pageref{sec:homedir}, quando falamos sobre o diretório \emph{home}
dos usuários, uma das principais funções do diretório \emph{home} é
guardar os arquivos de configuração pessoal dos programas. Isso é
muito vantajoso para oferecer ao usuário uma configuração pessoal
condizente com as suas necessidades sem afetar os demais usuários do
sistema.
Porém, essa configuração é um pouco chata, e pode ser útil que certos
padrões, como papéis de parede para ambientes gráficos, páginas
iniciais e parâmetros de configuração do ambiente do \emph{shell}
possam ser definidos em certos padrões. Para isso, existe a
possibilidade de copiar-se um diretório de referência como o
\emph{home} a ser definido para o usuário, depois trocando-se o dono e
grupo do arquivo para o do usuário. Esse processo, porém, torna a
coisa toda maçante para o administrador.
O ponto bom é que o GNU/Linux, como os Unix em geral, pensou nessa
possibilidade e tornou possível criar-se um padrão para o diretório
\emph{home} dos usuários. Esse padrão é o diretório \texttt{/etc/skel}
(\emph{skel}, de \emph{skeleton}, que pode ser traduzido como
estrutura). No caso, tudo o que o administrador tem a fazer é, depois
de ter um padrão para os novos usuários configurado, copiar todos os
arquivos do \emph{home} aonde o padrão foi criado para dentro de
\texttt{/etc/skel} e remover quaisquer arquivos de uso pessoal do
usuário em questão de dentro desse diretório. O próprio
\texttt{adduser} irá copiar para dentro do \emph{home} do novo usuário
todos os arquivos e diretórios dentro do \texttt{/etc/skel} e passar a
posse dos mesmos para o novo usuário, sem muita dificuldade.
A posse dos arquivos e do diretório \texttt{/etc/skel} é do
\texttt{root}. Embora o diretório permita que o usuário o liste,
\emph{não é} uma boa idéia a cópia direta pelo usuário do diretório
\texttt{/etc/skel} ou de partes dele, primeiro pela possibilidade de
perder-se todas as configurações do ambiente, em segundo pois isso irá
complicar as coisas, pois o \texttt{root} terá que passar manualmente
a posse dos arquivos copiados\ldots
Mas mesmo assim, o administrador conseguirá sempre fazer bom uso de
\texttt{/etc/skel}.
\subsection{O arquivo \texttt{/etc/passwd} e o arquivo
\texttt{/etc/shadow}}
Como dissemos anteriormente, uma vez que você usa o comando
\texttt{adduser} para criar uma conta de usuário, você envia
informações para um arquivo de configuração. Esse arquivo é o arquivo
\texttt{/etc/passwd}. Ele é um arquivo de texto simples, que pode (mas
não deveria) ser editado manualmente com o uso de editores como
\texttt{vi} ou \texttt{emacs}. Um arquivo \texttt{/etc/passwd} típico
se parece com o mostrado no Trecho de Código \ref{code:passwd}, na
página \pageref{code:passwd}.
\begin{codigo}[htp]
\footnotesize
\begin{Verbatim}[frame=single,commandchars=+||]
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/sh
daemon:x:2:2:daemon:/sbin:/bin/sh
adm:x:3:4:adm:/var/adm:/bin/sh
+ldots
fecosta:x:500:500:Fábio Emilio Costa:/home/fecosta:/bin/bash
mpd:x:84:81:system user for mpd:/var/lib/mpd:/bin/false
tomcat:x:91:91:Tomcat:/usr/share/tomcat5:/bin/sh
svn:x:92:92:system user for subversion:/var/lib/svn:/bin/false
postgres:x:93:93:system user for postgresql:/var/lib/pgsql:/bin/bash
webdav:x:501:501::/home/webdav:/bin/true
adumbledore:x:502:502::/home/adumbledore:/bin/bash
mmcgonagall:x:503:503::/home/mmcgonagall:/bin/bash
ssnape:x:504:504::/home/ssnape:/bin/bash
sblack:x:505:505::/home/sblack:/bin/bash
hslughorn:x:506:506::/home/hslughorn:/bin/bash
\end{Verbatim}
\caption{Exemplo de \texttt{/etc/passwd}}
\label{code:passwd}
\end{codigo}
Cada linha é referente a um determinado usuário, e é composta por:
\begin{center}
\begin{verbatim}
user:password:uid:gid:gecos:home:shell
\end{verbatim}
\end{center}
O campo \texttt{user} é bem claro: é o nome do usuário. Perceba que o
primeiro deles é o \texttt{root}, e assim por diante. Alguns serviços,
como o MPD\footnote{\emph{Music Player Daemon} --- reprodutor de
música que pode atuar como servidor \emph{Shoutcast}} e o
Subversion\footnote{sistema de SCM (\emph{Source Control Management}
--- Controle de Código Fonte)} criam usuários especiais para si,
como \texttt{mpd} e \texttt{svn}. Esses usuários são apenas para que
os processos deles não ofereçam riscos no caso de exploração de
falhas.
O campo \texttt{password} é aonde iria normalmente as senhas, mas
atualmente são poucas (se alguma) as instalações aonde as senhas do
usuário são colocadas aí, pois o arquivo \texttt{/etc/passwd} tem que
ser de leitura aberta a todos, o que tornava muito fácil roubar-se o
arquivo e tentar-se quebrar as senhas por força bruta. Atualmente,
utiliza-se o arquivo \texttt{/etc/shadow}, que pode ser travado para
leitura para outros usuários fora o \texttt{root}. Esse campo pode
conter as opções mostradas na Tabela \ref{table:password}, na Página
\pageref{table:password}.
\begin{table}
\begin{center}
\begin{tabular}{|c|l|}
\hline
{\centering \textbf{\textsc{Campo \texttt{password}}}} & {\centering \textbf{\textsc{Comentários}}}\\
\hline\hline
Seqüência de caracteres & senha criptografada\\
Nada & Sem senha para essa conta\\
\texttt{*} & A conta em questão está desativada\\
\texttt{x} & A senha dessa conta está gravada em outro lugar\\
\hline
\end{tabular}
\label{table:password}
\caption{Valores típicos do campo \texttt{password} do \texttt{/etc/passwd}}
\end{center}
\end{table}
Os campos \texttt{uid} e \texttt{gid} contêm o UID e o GID principal
do usuário (o principal grupo ao qual o usuário faz parte) do
usuário. Esse valores são numéricos.
O campo seguinte \texttt{GECOS} servia como uma espécie de registro de
informações sobre o usuário, como telefone, local de serviço e
afins. Nos antigos ambientes Unix, essa informação era usada pelo
utilitário \texttt{finger}, e acabou sendo mantida por motivos
históricos. Atualmente, ela serve apenas para registros diversos, sem
função no sistema.
O campo \texttt{home} indica o diretório de \emph{home} do usuário em
questão. A estrutura normal é \texttt{/home/<usuario>}, mas não é
obrigatória (no exemplo, o \emph{home} do usuário \texttt{tomcat} é
\texttt{/usr/share/tomcat5}). Alguns programas utilizam o diretório
\emph{home} como uma forma simples de apontar para diretórios de
configuração dele.
O último campo, \texttt{shell}, define o \emph{shell} do
usuário. Perceba que existem casos de \emph{null shells}, como os dos
usuários \texttt{webdav}(\texttt{/bin/true}) e
\texttt{svn}(\texttt{/bin/false}).
\subsubsection{O arquivo \texttt{/etc/shadow}}
Perceba que é razoavelmente simples o arquivo \texttt{/etc/passwd}. O
resto do controle é feito no arquivo \texttt{/etc/shadow}, que tem a
seguinte estrutura (segundo o \emph{Linux Shadow Password
HOWTO}\cite{SHADOW-HOWTO1996}):
\begin{center}
\begin{verbatim}
user:password:last:may:must:warn:expire:disable:reserved
\end{verbatim}
\end{center}
Aonde \texttt{username} e \texttt{password} são equivalentes aos do
\texttt{/etc/passwd}. No caso do campo \texttt{password} ele pode
conter as opções mostradas na Tabela \ref{table:password}, na Página
\pageref{table:password}, exceto, obviamente, por \texttt{x}.
O campo \texttt{last} contêm o dia em que a senha foi trocada pela
última vez, no formato ``Unix \emph{timestamp}''\footnote{Um formato
aonde o valor é representado no número de dias passados do dia
1$^\circ$ de Janeiro de 1970}.
O campo \texttt{may} contêm o número de dias que o usuário deve
esperar antes de trocar sua senha por uma nova. Para evitar problemas,
esse valor pode ser mantido baixo.
O campo \texttt{last} contêm o número de dias que o usuário poderá
usar essa senha antes de ser obrigado a trocá-la.
O campo \texttt{warn} contêm o número de dias que o usuário deverá ser
informado de que sua senha está para expirar, de modo a trocá-la.
O campo \texttt{expire} contêm o número de dias após a senha ter
vencido que deve-se esperar até que a conta seja desabilitada.
O campo \texttt{disable} indica o dia em que a conta foi desabilitada
no formato ``Unix \emph{timestamp}''. E o campo \texttt{reserved} é
reservado para uso futuro.
Portanto, não é muito complexo o estudo dos arquivos
\texttt{/etc/passwd} e \texttt{/etc/shadow}. Perceba que falamos
apenas de \emph{estudo}.
\begin{quotation}
\textbf{Atenção:} A manipulação errônea dos arquivos
\texttt{/etc/passwd} e \texttt{/etc/shadow} podem possuir
conseqüências desastrosas. Evite o máximo que possível manipular
tais arquivos manualmente. Caso tenha que o fazer, faça uma cópia de
\emph{backup} de ambos os arquivos. \emph{Você foi avisado!!!}
\end{quotation}
Com isso, encerramos o assunto usuários. Vamos falar agora dos grupos
de usuários.
\section{Criando grupos: \texttt{addgroup}}
Os \emph{grupos} de usuários são muito úteis para estruturar de
maneira mais granular o acesso aos arquivos. Por exemplo, você pode
criar um diretório aonde o dono do arquivo seja você, mas você permita
que outros escrevam no diretório também (um \emph{sticky bit} aqui
pode ser muito útil para impedir outros de apagarem seus
arquivos). Para isso, é importante que o usuário esteja cadastrado no
grupo em questão.
Em geral, quando o usuário é criado, o padrão é que ele seja inserido
em um grupo especial só para ele, que poderíamos chamar de ``grupo do
eu sozinho'', o que permite o isolamento dos arquivos pessoais. Mas
algumas vezes isso pode ser inconveniente. Imagine, por exemplo, um
projeto aonde vários usuários precisem dividir os mesmos arquivos. A
opção se todos eles estiverem em ``grupos do eu sozinho'' seria o
\texttt{root} ficar copiando os arquivos e mudando a posse dos
arquivos para cada um dos participantes periodicamente. Isso
ocasionaria todo o tipo de problemas.
Para evitar isso, o GNU/Linux, como os Unix em geral, possui o sistema
de permissão por grupos. Se configurado corretamente, um grupo pode
permitir que usuários diversos utilizem-se dos arquivos de outros
usuários, inclusive os editando, sem maiores inconvienentes.
Para adicionar um novo grupo, utiliza-se o comando
\texttt{addgroup}. Usam-se as mesmas opções do caso do
\texttt{adduser}(Seção \ref{sec:adduser}, Página
\pageref{sec:adduser}), mas na realidade, nenhuma delas é útil (com a
possível exceção de \texttt{-p}). Portanto, vamos tratar normalmente
dos comandos.
Vamos imaginar que o usuário \texttt{adumbledore} deseje criar um
grupo para sair do ``grupo do eu sozinho'', então usa o comando
\texttt{addgroup} para criar o grupo \texttt{orderphoenix}. Para isso,
ele usa o comando \texttt{addgroup orderphoenix}.
\subsection{O cuidado com os GID}
Muito cuidado se quiser reaproveitar GIDs para novos grupos. Da mesma
forma que no caso dos UIDs, os GIDs são fixados nos arquivos, o que
pode fazer que usuários de um grupo com o GID reaproveitado possam
acessar arquivos que não deveriam.
\subsection{O arquivo \texttt{/etc/group}}
As informações sobre os grupos são armazenadas no arquivo
\texttt{/etc/group}, que o sistema consulta toda vez que precisa
pesquisar acessos por grupo. No caso, a estrutura desse arquivo é:
\begin{center}
\begin{verbatim}
NomedoGrupo:senha:GID:usuários
\end{verbatim}
\end{center}
Aonde \texttt{NomedoGrupo} é o nome do grupo criado, \texttt{senha} é
a senha para realizar-se operações como esse grupo em especial (que
pode também estar em outro arquivo, o \texttt{/etc/gshadow}), e
\texttt{GID} mostra o número do GID do grupo em questão.
A parte importante do arquivo fica logo em seguida, com o campo
\texttt{usuários}, aonde ficam os usuários que fazem parte desse
grupo. O Trecho de Código \ref{code:group}, na página
\pageref{code:group}, mostra um exemplo de \texttt{/etc/group}.
\begin{codigo}[htp]
\footnotesize
\begin{Verbatim}[frame=single,commandchars=+||]
root:x:0:
bin:x:1:
daemon:x:2:messagebus
sys:x:3:
adm:x:4:
(+ldots)
audio:x:81:
video:x:82:
users:x:100:
nogroup:x:65534:
(+ldots)
mysql:x:79:
gdm:x:422:
canna:x:423:
haclient:x:60:
squid:x:424:
sshd:x:83:
slocate:x:425:
fecosta:x:500:
(+ldots)
adumbledore:x:502:
mmcgonagall:x:503:
ssnape:x:504:
sblack:x:505:
hslughorn:x:506:
hogwarts:x:507:adumbledore,mmcgonagall,ssnape,hhagrid
orderphoenix:x:509:adumbledore
aurors:x:510:amoody
\end{Verbatim}
\caption{Exemplo de \texttt{/etc/group}}
\label{code:group}
\end{codigo}
Perceba que a maioria dos grupos são ``grupos do eu sozinho'' e não
mostram outros usuários: isso porque o GNU/Linux, quando um grupo tem
o mesmo nome do usuário, ele é considerado um ``grupo do eu sozinho''.
Perceba também que, da mesma forma que o \texttt{/etc/passwd}, ele
\emph{não possui ordem, exceto pela a de entradas no registro}.
Porém, perceba, o grupo \texttt{orderphoenix}: ele está com senha em
\texttt{/etc/gshadow} e tem como participante o usuário
\texttt{adumbledore}. No caso, seu ``dono'' (o usuário
\texttt{adumbledore}) deseja incluir os usuários \texttt{mmcgonagall}
(que tem como grupo principal \texttt{hogwarts}), \texttt{hhagrid}(que
tem como grupo principal \texttt{hogwarts}) e \texttt{amoody}(que tem
como grupo principal \texttt{aurors}). Para isso, ele pede ao
\texttt{root} que edite o \texttt{/etc/group} para incluir esses três
usuários. O \texttt{/etc/group} resultante fica como o do Trecho de
Código \ref{code:group2}, na página \pageref{code:group2}.
\begin{codigo}[htp]
\footnotesize
\begin{Verbatim}[frame=single,commandchars=+||]
root:x:0:
bin:x:1:
daemon:x:2:messagebus
sys:x:3:
adm:x:4:
(+ldots)
adumbledore:x:502:
mmcgonagall:x:503:
ssnape:x:504:
sblack:x:505:
hslughorn:x:506:
hogwarts:x:507:adumbledore,mmcgonagall,ssnape,hhagrid
orderphoenix:x:509:adumbledore,mmcgonagall,hhagrid,amoody
aurors:x:510:amoody
\end{Verbatim}
\caption{Exemplo de alteração em \texttt{/etc/group}}
\label{code:group2}
\end{codigo}
\subsection{Usando \texttt{adduser} para adicionar um ususuário a um
grupo extra}
Existe uma outra forma de adicionar-se usuários a um grupo, que é
usando o comando \texttt{adduser}. Para isso, usa-se \texttt{adduser
<grupo> <usuario>}, de modo que nesse caso não será criado um novo
usuário com o mesmo nome, mas sim o sistema irá adicionar o usuário ao
novo grupo (um usuário para um grupo por vez).
Retornando ao nosso exemplo: a seguir, ele decide incluir os usuários
\texttt{sblack}(que tem como grupo principal \texttt{marauders}),
\texttt{rlupin}(que tem como grupo principal \texttt{marauders}) e
\texttt{ssnape}(que tem como grupo principal \texttt{deatheaters}).
Para isso, ele (na verdade, o \texttt{root}, mas se o \texttt{root}
quiser --- \emph{não é recomendável} --- ele pode deixar o comando
\texttt{adduser} \emph{suid}) utiliza a combinação de comandos
mostradas noTrecho de Código \ref{code:group3}, na página
\pageref{code:group3}, tendo o resultado listado na mesma listagem.
\begin{codigo}[htp]
\footnotesize
\begin{Verbatim}[frame=single,commandchars=+||]
[root@hufflepuff CursoGNULinux]# adduser orderphoenix sblack
[root@hufflepuff CursoGNULinux]# adduser orderphoenix rlupin
[root@hufflepuff CursoGNULinux]# adduser orderphoenix ssnape
[root@hufflepuff CursoGNULinux]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:messagebus
sys:x:3:
adm:x:4:
(+ldots)
deatheaters:x:3000:ssnape,lmalfoy,wmcnair,ppettigrew
marauders:x:3000:jpotter,sblack,ppettigrew,rlupin
adumbledore:x:502:
mmcgonagall:x:503:
ssnape:x:504:
sblack:x:505:
hslughorn:x:506:
hogwarts:x:507:adumbledore,mmcgonagall,ssnape,hhagrid
orderphoenix:x:509:adumbledore,mmcgonagall,hhagrid,amoody
aurors:x:510:amoody
\end{Verbatim}
\caption{Exemplo do uso do comando \texttt{adduser} para adicionar
usuários a outros grupos, assim como o resultado desse uso}
\label{code:group3}
\end{codigo}
Isso deve bastar sobre adicionar usuários nos grupos. Vejamos agora
sobre como usar a questão de grupos a seu favor.
\subsection{Acessando documentos com outra identificação de grupo:
\texttt{sg}, \texttt{newgrp} e \texttt{id}}
Em geral, uma vez que você tenha entrado em um outro grupo, você pode
acessar todos os arquivos daquele grupo normalmente. Em alguns casos,
porém, você precisa que a \emph{identificação de grupo} sua seja
alterada para aquele procedimento. Existem duas formas de se fazer
isso:
\begin{enumerate}
\item usando \emph{setgid} no arquivo/programa a ser manipulado;
\item usando o comanto \texttt{sg} (\emph{substitute group});
\end{enumerate}
O \texttt{sg} lembra um pouco o \texttt{su}, mas ele vale para apenas
um comando. A forma de uso é \texttt{sg <grupo> '<comando'}. Ele irá
pedir a senha do grupo: se esta estiver incorreta ou não tiver sido
definida, você não poderá realizar a operação.
Qual a vantagem do uso \texttt{sg}? Normalmente, você está sempre como
se você fosse do seu ``grupo do eu sozinho''. É possível alterar
permanentemente o grupo principal, manipulando o arquivo
\texttt{/etc/passwd} e modificando manualmente o GID para o do grupo
desejado. Porém, isso não é recomendável (e muitas vezes nem possível,
uma vez que apenas o \texttt{root} pode escrever no
\texttt{/etc/passwd}). Nesse caso, utiliza-se o \texttt{sg} para
``alternar-se'' para outro grupo e poder manipular o arquivo em
questão.
Por exemplo: imaginemos que o usuário \texttt{adumbledore} esteja
querendo ler e fazer comentários no arquivo \texttt{voldieplans} do
usuário \texttt{ssnape}. Esse arquivo tem como dono \texttt{ssnape},
grupo designado \texttt{orderphoenix} (ao qual \texttt{adumbledore})
também pertence) e permissões \verb|rw-rw---| (o que quer dizer que
apenas o dono e o grupo sabe da existência do arquivo). Como
\texttt{adumbledore} sabe da existência do arquivo, ele apenas digita
o comando \texttt{sg 'emacs voldieplans'}\footnote{Alvo Dumbledore usa
EMACS, pessoal!! E o autor também! :P}. Ele passa então a editar o
arquivo normalmente, como se tivesse como grupo principal
\texttt{orderphoenix}. Assim que ele terminar, ele volta ao normal, ao
seu ``grupo do eu sozinho''.
É possível alterar-se durante uma sessão o grupo efetivo de uso,
através do comando \texttt{newgrp <grupo>}. Nesse caso, o grupo
torna-se efetivo até que o usuário digite \texttt{exit} ou
\texttt{newgrp -}. De outra forma ele opera exatamente da mesma forma
que o comando \texttt{sg}.
Como final, o comando \texttt{id} mostra as informações do usuário
atual (pode-se usar \texttt{id <usuario>} para ver as de outro
usuário). Nesse caso, mostra-se tanto o UID/GID real quanto o efetivo
(que pode ser mudado por \texttt{su}, \texttt{sg} ou \texttt{newgrp}).
\subsection{Alterando senhas: o comando \texttt{passwd}}
Algumas vezes, precisamos mudar a senha de um usuário (ou o próprio
usuário mudar sua senha). Para isso, usa-se o comando
\texttt{passwd}. Esse comando abre uma janela simples aonde pede-se a
senha antiga, a nova senha e uma confirmação da nova senha. Em versões
mais atuais, o \texttt{passwd} utiliza o utilitário \texttt{crack}
para checar a força da senha. Caso não seja forte o suficiente, alerta
o usuário para que ele forneça uma senha mais forte\footnote{ou que se
conforme se algo acontecer de errado no futuro :P}. Apenas o dono de
uma conta ou o \texttt{root} pode alterar a senha da conta. Para
alterar-se uma senha, usa-se \texttt{passwd <usuario>}. Se
\texttt{<usuario>} não for fornecido, admite-se o usuário atual como o
que terá a senha trocada.
Também é possível usar-se \texttt{passwd} para trocar a senha de um
grupo. Essa operação só pode ser feita pelo \texttt{root} ou pelo
administrador do grupo (o primeiro usuário listado na lista de
usuários do grupo, ou o próprio usuário, no caso de grupos ``do eu
sozinho''). Para isso, usa-se a sintaxe \texttt{passwd -g <grupo>}.
O comando \texttt{passwd} possui mais uma grande quantidade de opções
de administração que não veremos aqui, pois são específicas para o
\texttt{root}, podendo causar bloqueio de contas e configurar
parâmetros de validade e alternância de senhas. Para isso, consulte a
\emph{manpage} \texttt{passwd(1)}. Se quiser saber mais sobre
administração de grupos, inclusive bloqueio de grupos, consulte a
\emph{manpage} do utilitário \texttt{gpasswd(1)}.
\subsection{Removendo usuários e grupos: \texttt{userdel} e \texttt{groupdel}}
Algumas vezes, precisamos remover usuários e grupos por vários
motivos, seja pela demissão do usuário ou apenas pelo cancelamento de
seus projetos. O ideal é que você não remova contas, a não ser que os
usuários em questão tenham deixado a instituição ou perdido o direito
de uso ao sistema. Nesse caso, a sugestão é:
\begin{enumerate}
\item Realize \emph{backup} dos arquivos pessoais do usuário para
qualquer eventualidade. Veremos mais sobre isso na Seção
\ref{sec:backup}, \pageref{sec:backup};
\item Desabilite a conta do usuário (ela ainda estará lá, mas na
prática o usuário não conseguirá mais se logar;
\item Apague qualquer arquivo ou diretório desnecessário e troque a
posse dos demais arquivos e diretórios. Isso atua tanto para salvar
espaço em disco quanto para impedir falhas de segurança;
\item Elimine a conta do usuário;
\end{enumerate}
A primeira parte (\emph{backup}) é simples e envolve pouco esforço. O
segundo passo pode ser feito de duas formas:
\begin{enumerate}
\item Editando manualmente o arquivo \texttt{/etc/passwd} (ou
\texttt{/etc/shadow}) e no campo \texttt{password} deles e colocando
o símbolo \texttt{*} na frente da senha criptografada (esse
procedimento \emph{não é recomendável}, uma vez que um erro na
edição manual desses arquivo pode por todo o sistema a pique);
\item Usando o comando \texttt{passwd -l <usuário>} para desabilitar a
conta (recomendável);
\end{enumerate}
Esse último passo pode ser feito como uma segurança, por exemplo, caso
o usuário em questão saia de férias.
A terceira parte envolve os comandos que já estudamos no Capítulo
\ref{cap:iniciando}, na Página \pageref{cap:iniciando}, como o
\texttt{cp}, \texttt{rm} e \texttt{chowm}. O \emph{backup} dos
arquivos antes é para permitir que arquivos acidentalmente deletados
possam ser recuperados em caso de necessidade.
A última etapa é a remoção propriamente dita do usuário, com o uso do
comando \texttt{userdel}, que remove todas as entradas do usuário em
arquivos de configuração (\texttt{/etc/passwd}, \texttt{/etc/shadow},
\texttt{/etc/group}, \ldots), sendo que sua sintaxe normal é
\texttt{userdel <usuario>}. Uma opção útil é a opção \texttt{-r}, que
remove os arquivos do usuário (incluindo seu \emph{home}), o que
permite poupar algumas etapas (basta copiar os arquivos importates
daquele usuário para outro diretório).
Para remover um grupo, você irá utiliza o comando
\texttt{groupdel}. Esse comando remove a entrada do grup em
\texttt{/etc/group}. No caso, ele tem uma ``pegadinha'': você nunca
poderá remover um grupo primário de um usuário (em geral, os ``grupos
do eu sozinho'') sem antes remover o usuário em questão. O uso de
\texttt{groupdel} é \texttt{groupdel <usuario>}.
Todos esse comandos foram oferecidos apenas como uma introdução à
administração do usuário. Existem muitos outros comandos úteis, como
\texttt{usermod(8)}, \texttt{groupmod(8)}, \texttt{groupmod(8)},
\texttt{chfn(1)} e \texttt{chsh(1)}, mas não trataremos deles aqui:
consulte as \emph{manpages} deles para maiores informações.
Agora que terminamos o tópico usuários, vamos passar para o tópico de
administração dos programas em execução. Ou como chamamos em Unix (e
GNU/Linux), de \emph{administração de processos}.
\section{Entendendo processos e \emph{jobs}}
No GNU/Linux, como no Unix, todos os programas do usuário são chamados
de \emph{processos}. Na prática, todo programa que está carregado é um
\emph{processo}. O objetivo dessa seção é que você compreenda o
funcionamento dos processos e entenda como eles funcionam, consiga
identificar e solucionar problema com processos.
\subsection{O que é um processo}
No GNU/Linux, quando uma cópia de um programa é carregada para
memória, certas alocações de recursos como memória, discos, portas
TCP, \ldots são realizadas pelo sistema operacional, através de
programas conhecidos como \emph{loaders}\footnote{Isso apenas no
primeiro momento. Depois dele, a carga de recursos em tempo real é
responsabilidade do próprio programa}. Em geral, o \emph{loader} é
embutido no programa, portanto chamar o programa já automaticamente
dispara o \emph{loader} para que o mesmo seja carregado na memória.
Uma vez que o \emph{loader} carregue todas as informações do programa
para que ele possa ser executado, ele envia informações sobre o
programa carregado na memória para um trecho de código do
\emph{kernel} chamado \emph{escalonador de processos}, que é
responsável pelo controle do tempo de execução dos processos. Isso
porque, embora falemos que o GNU/Linux é multi-tarefa, na prática,
exceto em sistemas multiprocessados, o sistema executa \emph{uma
tarefa por vez}. O escalonador de processos passa então a controlar
quanto tempo o processo está trabalhando, para que, após algum tempo,
o controle do sistema seja passado para outro programa.
Quando o \emph{loader} passa as informações do sistema para o
escalonador de processos, o escalonador ``cria'' um processo para o
programa carregado\footnote{Na prática, quem cria o processo é o
\emph{loader}, mas essa pequena alteração pode ser útil para a
compreensão da idéia de processo}, sendo que o mesmo recebe um PID
(\emph{process ID} --- identificador de processo), dado pelo
escalonador, que também passa a manter certos registros de
contabilidade do acesso do processo aos recursos do sistema, assim
como informações sobre o usuário e grupo \emph{efetivos} que disparou
o programa\footnote{lembrando que essas informações podem ser
alteradas por permissões e comandos especiais, como \emph{suid} e
\texttt{sg}} e \emph{grau de prioridade} do processo no sistema. A
partir de todas essas informações, principalmente no grau de
prioridade (ou \emph{prioridade}, para resumir), o escalonador vai
determinando como os processos usarão os recursos do sistema.
\subsubsection{Processos de primeiro e segundo plano}
Normalmente, em todo sistema multitarefa, existem milhares de
processos em execução. O sistema precisa decidir, portanto, como ele
irá proceder com cada um. Mas isso em geral é transparente ao usuário,
para o qual apenas importa em qual programa ele está trabalhando no
momento.
O GNU/Linux utiliza, como outros sistemas operacionais multitarefa, o
conceito de \emph{primeiro plano}(\emph{foreground}) e \emph{segundo
plano}(\emph{background}).
Um processo em geral é considerado de \emph{primeiro plano} quando o
usuário está o manipulando \emph{interativamente} e espera receber a
saída do mesmo. Por exemplo: um comando \texttt{ls -la} é um processo
de primeiro plano, pois o usuário precisará receber a saída do
comando, assim como quando um usuário está usando o \texttt{emacs},
por exemplo. Só pode haver \emph{um} processo em primeiro plano por
usuário.
Processos em \emph{segundo plano} são processos cujo resultados o
usuário não precisa de imediato. Em geral, servidores no GNU/Linux são
executados em \emph{segundo plano}, pois os resultados dos acessos a
ele podem ser acompanhados via \emph{logs} do sistema. Um programa é
carregado em segundo-plano no GNU/Linux quando usa-se diante dele o
símbolo \texttt{\&}(\emph{e} comercial).
\begin{quotation}
\textbf{Atenção:} O fato de que um processo foi enviado para segundo
plano \emph{não quer dizer que ele não irá devolver nehuma
saída}. Para evitar tornar o seu \emph{shell} uma bagunça, é
interessante que a saída de um programa em segundo plano seja
redirecionada para um arquivo;
\textbf{Atenção:} No GNU/Linux, programas gráficos estão
\emph{todos} em segundo plano. Apenas o servidor X-Windows fica em
primeiro plano. É importante essa distinção, pois ao invocar um
programa gráfico você pode travar o seu \emph{shell}, não mais o
podendo utilizar. Veremos mais sobre isso quando falarmos de
Interfaces Gráficas no Capítulo \ref{sec:wm} (Página
\pageref{sec:wm}).
\end{quotation}
A principal vantagem do uso de processos de segundo plano é o fato de
que você pode automatizar comandos e não precisar ficar esperando ou
operando interativamente. Combinando redirecionamento e \emph{pipes}
(que falamos no Capítulo \ref{cap:iniciando}, na Seção
\ref{sec:redirect}, Página \pageref{sec:redirect}) com o uso de
programas em segundo plano, você pode automatizar uma série de tarefas
administrativas.
\subsection{Diferença entre programas multi-thread e programas de
múltiplos processos}
O GNU/Linux, como muitos servidores, além de ser multitarefa, aceita
aplicações \emph{multithreaded}. Os programas dotados de
\emph{multithread} executam partes internas dele em paralelo, da mesma
forma que o SO multitarefa executa muitas tarefa em paralelo. Para
isso, em alguns casos, utiliza-se tanto de um escalonador interno ao
processo quanto, no caso do GNU/Linux, bibliotecas que fazem com que o
escalonador de processos considere as \emph{threads}\footnote{uma
\emph{thread} é parte do processo pai, mas embora rode em paralelo
em relação a outras \emph{threads}, compartilha o acesso a memória e
outros recursos com as demais \emph{threads}.} dentro do sistema.
Muitos servidores antigos, como o Apache até a versão 2.0 e o
PostgreSQL são servidores multi-processos: o servidor que é carregado
pelo sistema tem como função apenas gerar outros processos que
realizem a requisição efetuada. Isso causa um certo \emph{overhead}
pois o sistema tem que ser interrompido para que o novo processo seja
gerado (\emph{process spawn}) e para que recursos sejam alocados ao
mesmo. Além disso, em alguns casos, o processo gerador fica
interrompido, impedindo que ele gere novos processos para atender
novas requisições. Em geral isso ocorre quando um determinado número
de processos-filhos foram gerados. Uma terceira dificuldade é que,
como cada processo-filho possui seu próprio espaço de memória alocada
e recursos, isso pode aumentar \emph{rapidamente} o consumo da memória
e dos recursos computacionais do sistema, além de acarretar mais
processamento por parte do escalonador de processos.
Por sua vez, processo \emph{multithread} atendem suas requisições
gerando novas \emph{threads} dentro deles. Isso tem um menor
\emph{overhead} do que o \emph{process spawn}, além de impedir que o
processo fique travado ou que o escalonador de processos tenha mais o
que processar (mesmo quando o processamento das \emph{threads} é feito
pelo escalonador do sistema, isso permite que várias \emph{threads}
possam ser atendidas quando uma ou mais delas necessitem ou tenham
tempo de processamento disponível). Em compensação, é muito fácil para
um processo \emph{multi-thread} mal-implementado gerar uma \emph{race
condition}\footnote{condição de disputa na qual dois
processos/\emph{threads} necessitam de determinado recurso} ou
\emph{deadlocks}\footnote{situação em que um programa A exige um
recurso que um programa B está alocando, que por sua vez exige um
recurso que um programa C está alocando, que por sua vez exige um
recurso que um programa A está alocando, e todos os três estão
esperando que os recursos desejados estejam disponíveis para liberar
os recursos que estão usando} do que em programas multi-processos,
pois em geral os recursos entre processos não são disputados (tem ou
não tem disponível).
Em que isso afeta a administração do sistema? Quando você tem um
servidor \emph{multithread} você possui apenas um processo desse
servidor, enquanto no caso de servidores multiprocessso você tem
vários processos. Veremos melhor isso quando usarmos o comando
\texttt{ps} para vermos os acontecimentos dentro do sistema (Seção
\ref{sec:ps}, Página \pageref{sec:ps}).
\subsection{Estado de processos}
Por causa do escalonamento, existem vários processos ao mesmo tempo
``em execução'' no sistema (lembrando que o escalonador de processo
libera apenas um processo por vez a ser executado por alguns
instantes, passando a execução para outro logo em seguida). Portanto,
cada um dos vários processos no sistema possui um estado
diferente. Basicamente existem quatro estados no qual um processo pode
estar:
\begin{itemize}
\item \textbf{Processo em primeiro plano (\emph{foreground}):} são
processos que estão bloqueando o terminal. Normalmente são
processos que exijem interatividade, como ler \emph{email} ou
digitar um texto no \texttt{vi};
\item \textbf{Processo em segundo plano (\emph{background}):} são
processo que, embora estejem recebendo e enviando dados, ele não
exige interatividade de nenhum tipo. Em geral, os servidores (ou
\emph{daemons}) do sistema contam como exemplo de processos em
segundo plano, assim como os programas rodando sobre uma interface
gráfica;
\item \textbf{Processos parados:} são processos que estão
paralizados por algum motivo, mas que voltarão a ser executado. Um
exemplo é o processo \texttt{init}: ele inicializa todo o sistema,
realizando uma série de configurações, que por sua vez culminam
com o disparo de processos \texttt{login}, quando então ele vai
para o estado parado. Por sua vez, \texttt{login} também é
normalmente um processo parado: uma vez que um \emph{login} tenha
sido feito de maneira bem sucedida, o processo \texttt{login} gera
um processo do \emph{shell} apropriado ao usuário e fica parado,
voltando a ser executado quando o usuário abandona aquele
\emph{shell}, quando \texttt{login} espera um novo \emph{login}
bem sucedido, que irá gerar um novo processo \emph{shell} e assim
\emph{ad infinitum}. Ao processo que fica parado após gerar um
processo é chamado \emph{processo pai} e ao que foi gerado,
\emph{processo filho};
\item \textbf{Processos zumbis:} Algumas vezes, um processo pai
``morre'' (ou seja, é encerrado) antes de um processo filho. O
normal é que o processo pai, ao ``morrer'', ``mate'' também os
processos filhos. Também é responsabilidade do processo pai
desalocar os recursos usados pelo processo filho. Pode acontecer,
porém, de o processo filho não ``morrer'' por algum motivo. Nesse
caso, pode acontecer do processo filho, ao ``morrer'', tentar
devolver recursos ao processo pai (``morto'') e não o conseguir.
Nesse caso, o processo filho simplesmente ``congela'', virando um
processo zumbi. O problema desses processos é que eles amarram
consigo recursos preciosos para o sistema. É possível forçar um
processo a ficar ativo mesmo depois do seu pai ter ``morrido'',
mas sem correr o risco de torná-lo zumbi, por meio do comando
\texttt{nohup} (Seção \ref{sec:nohup}, Página
\pageref{sec:nohup}). Outro motivo para um processo virá zumbi
pode acontecer se \emph{``um programa cria um processo e demora
para consultar seu resultado após seu término, o processo
permanece como `zumbi'. Geralmente, é um bug do programa pai do
processo. Se existirem muitos processos "zumbi", pode ser
necessário terminar o programa pai para desocupar a tabela de
processos do kernel.''}\cite{ZAGO2006};
\end{itemize}
É muito importante sabermos distinguir como os processos estão
situados no sistema, principalmente por causa dos zumbis. Para isso,
precisamos saber como vistoriar o sistema atrás de processos. O
comando para isso é o \texttt{ps}.
\subsection{O comando \texttt{ps}}
\label{sec:ps}
O comando \texttt{ps} (\emph{process scan} --- verificação de
processos) permite ao usuário investigar quais processos estão em que
situação. Para isso, basta usar o comando \texttt{ps}. É muito
interessante que a saída do \texttt{ps} seja redirecionada para o
\texttt{less} via \emph{pipe}.
O normal é apenas listar-se os processos do usuário, mas o \texttt{ps}
possui algumas opções interessantes, retirada de
\citeonline{FOCALINUX2005}. Perceba que as opções no \texttt{ps}
\emph{não levam} \texttt{-}:
\begin{itemize}
\item \texttt{a}: mostra os processos em execução de todos os
usuários;
\item \texttt{x}: mostra processos que não são controlados pelo
terminal;
\item \texttt{u}: mostra quem disparou o processo (UID efetivo) e
quando ele foi iniciado;
\item \texttt{m}: mostra o consumo de memória no processo;
\item \texttt{f}: mostra uma árvore mostrando quem é pai de quem
(útil para detectar, junto com outras opções, para detectar
processos zumbis e seus pais);
\item \texttt{w}: mostra o que não couber na linha na(s) linha(s)
seguinte(s). Normalmente, cada processo ocupa apenas uma linha;
\end{itemize}
Existem muitas outras opções no \texttt{ps}, e para saber mais sobre
elas a consulta à \emph{manpage} \texttt{ps(1)} é \emph{altamente}
recomendável.
O \texttt{ps} mostra vários campos úteis, contendo o PID, nome e grupo
real e efetivos do usuário que disparou o processo, tempo de execução,
memória consumida e outros. Mas a coluna mais interessante para nós é
a coluna \texttt{s}, ou \texttt{stat}, que apresenta para nós qual o
estado de cada processo dentro do sistema:
\begin{itemize}
\item \texttt{D}: processo dormente em estado
ininterrupto. Normalmente fica nesse estado processos que dependem
de uma operação de I/O, como servidores de arquivo;
\item \texttt{R}: processo que está ou pode vir a ser executado
(\emph{ready}, pronto);
\item \texttt{S}: dormindo, pode ser chamado por um processo ou
\emph{system call}. Normalmente fica nesse estado processos que
estejam esperando outros processos serem processados para agirem
em cima de seus resultados (um servidor Web durante a execução de
um CGI, por exemplo);
\item \texttt{T}: paralizado, normalmente aparece quando um programa
está sofrendo depuração;
\item \texttt{W}: paginado, mandado para a memória virtual (caiu na
versão 2.6 do \emph{kernel} Linux);
\item \texttt{Z}: processo zumbi.
\end{itemize}
Outra coluna útil é a \texttt{\%CPU}, que retorna a quantidade de CPU
consumida pelo processo em questão. A soma de todas as entradas da