Apenas começando a mergulhar no terminal graças ao divertido Raspberry Pi. Tenho uma coisa em particular que ainda me deixa coçando a cabeça:
Estou percebendo os diferentes daemons / serviços / processos / aplicativos / etc (algo mais que estou deixando de fora?) Que também são chamados de maneira diferente.
É mais ou menos isso que quero dizer:
(programa, nome do arquivo)
nano mytextfile
(serviço, ação, programa)
service restart nginx
(ação, programa)
killall openvpn
Tem sido basicamente exercícios de memorização para mim neste momento e ainda não compreendo a sintaxe. É algo assim?:
"service" when it's a service, as opposed to...? >
action for program if applicable >
name of program >
additional parameters
Alguém poderia explicar brevemente a diferença entre estes e as diferentes formas de acessá-los?
Dos padrões potenciais que você listou, este é o único que realmente existe:
Primeiro, algumas definições de palavras:
sshd
), servidor web (Apache), gerenciador de conexões de rede (NetworkManager
,ModemManager
)...service
começou sua vida como um wrapper simples para scripts de inicialização/desligamento no estilo SysVinit. Se o SysVinit tradicional for usado comoinit
sistema (o processo nº 1, a "mãe de todos os processos") no Linux, esses scripts geralmente estão localizados no/etc/init.d
diretório. Esses scripts têm parâmetros padronizados:start
para iniciar um serviço,stop
para interrompê-lo oustatus
para consultar o estado de um serviço. Existem alguns outros.Mas como escrever
/etc/init.d/<service name> <action parameter>
era tedioso, alguém criou um script wrapper simples:service <name> <action parameter>
originalmente significava apenas/etc/init.d/<name> <action parameter>
.Quando o SysVinit foi substituído por alternativas mais modernas (
systemd
,upstart
ou outros), as pessoas quiseram manter oservice
comando familiar e o transformaram em um wrapper para o comando equivalente em seuinit
sistema. Quandosystemd
é usado,service <name> <action parameter>
geralmente é apenas um invólucro para arquivossystemctl <action parameter> <name>
. Observe a ordem alterada dos parâmetros.Primeiro no Unix a filosofia é que tudo é um arquivo. Em todos os seus comandos, você está lidando apenas com arquivos em seu disco rígido:
mytextfile
,nginx
ouopenvpn
são todos arquivos.Agora, o que os arquivos representam e quais ações você pode ter sobre eles são meramente ditados por convenções. Às vezes, e vindo de algum outro sistema operacional, os arquivos têm extensões para ilustrar melhor o que eles fazem. Como um arquivo de texto que você pode editar estará
.txt
no final, um programa será.sh
ou.php
ou.pl
, etc. Mas existem apenas convenções (o bit unixx
para executar é outra dica sobre o que é dado versus o que é executável)O que você lista são ações (
nano
,service restart
,killall
) em diferentes objetos/arquivos (mytextfile
,nginx
,openvpn
).Dependendo da ação que você escolher e dos objetos, os resultados serão diferentes. Você também poderia ter feito
nano openvpn
e editaria, ou criaria, um arquivo chamadoopenvpn
onde você está (isso provavelmente seria inútil e perturbador, mas as ferramentas não proíbem isso).Agora, quanto às suas ações específicas:
nano
é um editor de texto, para modificar o conteúdo de qualquer arquivo (é claro que se for um arquivo binário - como alguns executáveis, mas não todos - seria a ferramenta errada para fazer qualquer coisa útil)service restart
é uma ação com uma "subação" de reinicialização que usa a estrutura atual em seu sistema para iniciar/parar processos de longa duração, também chamados de daemons; observe que é apenas um caso entre outros, poderia ter sido/etc/init.d/nginx restart
em outro lugar ousystemctl restart nginx.service
; o fato derestart
existir como uma subação é totalmente específico doservice
comando; qualquer comando pode ter sintaxe diferente, com diferentes opções, argumentos, subações, etc. Ninguém pode memorizá-los todos.killall
é um comando para ver a lista de todos os processos em execução e eliminar os que correspondem ao nome fornecido (um aviso: este comando não faz as mesmas coisas em todos os sistemas Unix, portanto, certifique-se de ler o manual no host que você estão usando antes de usá-lo), então você pode fornecer qualquer nome e não necessariamente algo que exista como um arquivo no discoMuitos de seus termos são sinônimos e definidos vagamente de qualquer maneira. Um aplicativo é tudo o que pode ser executado (ser executado), quando está em execução é um processo tratado pelo kernel entre muitos outros processos. Aplicativos de vida longa normalmente não estão sob controle direto do usuário, como aplicativos de rede como um servidor da web, eram frequentemente chamados de daemons no passado e hoje são chamados de serviços (ainda mais com a
systemctl
sintaxe de exemplo acima)Você não deveria ter que memorizar nenhum tipo dessas coisas. Você aprenderá usando-os, como se você trabalha com
nginx
um servidor web, você precisará reiniciá-lo e em sua plataforma específica para issoservice restart
e assim por diante.Embora existam convenções padrão, como:
Não há nada realmente impedindo um desenvolvedor de quebrar a convenção por qualquer motivo e usar qualquer sintaxe que desejar. Então, na verdade, depende apenas do aplicativo que você está usando no momento.
Geralmente, você descobrirá que o padrão GNU vinculado acima é muito comum e notará com o tempo que muitos comandos usam argumentos semelhantes para coisas semelhantes (por exemplo:
-v
para imprimir uma saída detalhada)Não se preocupe em memorizar nada disso. Para os aplicativos que você usa regularmente, você eventualmente aprenderá a sintaxe e ela se tornará uma segunda natureza. Para aplicativos com os quais você não está familiarizado, sempre há páginas de manual ou o
--help
sinalizador.Ter um conhecimento geral do que os comandos essenciais fazem e ser capaz de abrir e analisar rapidamente uma página de manual é infinitamente mais importante do que memorizar os sinalizadores para cada comando.
O "padrão" é dado pela gramática do shell. Em casos simples, é um comando (ou melhor, um utilitário ), seguido de argumentos . Os argumentos podem ser opções e as opções podem ter argumentos opcionais . Após as opções podem existir outros operandos .
Exemplo:
ls
é o comando,-l
é uma opção (sem argumento de opção) edir
é um operando. Sabemos quedir
não é um argumento de opção para a-l
opção, pois lemos ols
manual em que a seção de sinopse descreve a sequência de chamada do utilitário.Exemplo:
git
é o comando e como não há opções imediatamente após o nome do comando, o restante é tratado como operandos. Cabe aogit
comando interpretar isso. Você pode querer chamar ocommit
operando de "subcomando" se desejar, e-p
uma "opção" para este subcomando.Exemplo:
Aqui,
cc
é o comando e ambos-o
e-Wall
são opções. A-o
opção recebecode.o
como um argumento de opção. Dependendo docc
comando, a-Wall
opção pode de fato ser analisada como-W all
, ou seja, como uma opção com um argumento de opção (opções de uma letra não requerem um espaço antes de seus argumentos de opção).code.c
é um operando, pois ocorre após todas as opções.As palavras "argumento", "opção" e "argumento de opção" são as utilizadas pelo padrão POSIX . O padrão usa a palavra "utilitário" em vez de "comando", pois um comando pode ser simples, uma lista, composto, pipeline etc. Por exemplo,
ls -l dir
é um comando (simples) usando o utilitáriols
e{ head -n 20 | tail -n 5; } >file
é um comando composto contendo um pipeline e dois comandos simples.Indiscutivelmente, todas as invocações de utilidade são "ações". Dizer
killall myprog
significa "iniciar o utilitáriokillall
com o operandomyprog
". O efeito disso será que a utilidade, neste caso, envia um sinal para um processo.Da mesma forma,
service restart nginx
é a ação de invocar oservice
utilitário comrestart
enginx
como os dois operandos. O efeito disso será que onginx
serviço é reiniciado.Da mesma forma,
nano somedoc
é a ação de invocar onano
editor, etc. etc.