Na fonte do kernel Linux , os números de bloco em uma estrutura de inode no disco são de 32 bits. Por quê? Certamente o Linux pode suportar mais de 2^32 blocos...
extremeaxe5's questions
Eu tenho a seguinte interação de shell:
[OP@localhost linux]$ tty
/dev/pts/7
[OP@localhost linux]$ stty tostop
[OP@localhost linux]$
Em outro terminal, digito:
[OP@localhost linux]$ echo hello > /dev/pts/7
De volta ao original, vejo:
[OP@localhost linux]$ tty
/dev/pts/7
[OP@localhost linux]$ stty tostop
[OP@localhost linux]$ hello
Por que é isso? O processo de eco não deveria ser interrompido?
ps(1)
, com a -f
opção, produzirá processos para os quais não há linha de comando associada entre colchetes, assim:
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Aug28 ? 00:07:42 /sbin/init
root 2 0 0 Aug28 ? 00:00:01 [kthreadd]
root 3 2 0 Aug28 ? 00:00:00 [rcu_gp]
root 4 2 0 Aug28 ? 00:00:00 [rcu_par_gp]
root 6 2 0 Aug28 ? 00:00:00 [kworker/0:0H-kblockd]
root 8 2 0 Aug28 ? 00:00:00 [mm_percpu_wq]
root 9 2 0 Aug28 ? 00:02:14 [ksoftirqd/0]
root 10 2 0 Aug28 ? 00:05:33 [rcu_preempt]
root 11 2 0 Aug28 ? 00:01:36 [rcuc/0]
root 12 2 0 Aug28 ? 00:00:00 [rcub/0]
root 13 2 0 Aug28 ? 00:00:07 [migration/0]
root 14 2 0 Aug28 ? 00:00:00 [idle_inject/0]
root 16 2 0 Aug28 ? 00:00:00 [cpuhp/0]
root 17 2 0 Aug28 ? 00:00:00 [cpuhp/1]
root 18 2 0 Aug28 ? 00:00:00 [idle_inject/1]
root 19 2 0 Aug28 ? 00:00:05 [migration/1]
root 20 2 0 Aug28 ? 00:00:55 [rcuc/1]
Esses processos são agendados como outros processos?
Estou olhando para a saída strace de um processo bash em execução conectado a um terminal, para fins educacionais.
Meu processo bash tem PID 2883.
Eu digito
[OP@localhost ~]$ strace -e trace=openat,read,write,fork,vfork,clone,execve -p 2883 2> bash.strace
Em um terminal. Em seguida, entro no meu processo bash e tenho a seguinte interação:
[OP@localhost ~]$ ls
Olhando para a saída, vejo
strace: Process 2883 attached
read(0, "l", 1) = 1
write(2, "l", 1) = 1
read(0, "s", 1) = 1
write(2, "s", 1) = 1
read(0, "\r", 1) = 1
write(2, "\n", 1) = 1
clone(child_stack=NULL, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0x7fec6b1d8e50) = 3917
--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=3917, si_uid=1000, si_status=0, si_utime=0, si_stime=0} ---
write(1, "\33]0;OP@localhost:~\7", 23) = 23
write(2, "[OP@localhost ~]$ ", 22) = 22
...
Estou confuso nas duas últimas linhas. Parece que o bash está tentando escrever dois prompts de shell? O que está acontecendo aqui?
Na minha cópia do conda.sh
script, vejo as seguintes linhas:
if [ -n "${_CE_CONDA}" ] && [ -n "${WINDIR+x}" ]; then
SYSP=$(\dirname "${CONDA_EXE}")
else
SYSP=$(\dirname "${CONDA_EXE}")
SYSP=$(\dirname "${SYSP}")
fi
Estou curioso para saber por que há uma barra invertida na frente do d
in dirname
. Não acredito que seja necessário. Esse uso de barras invertidas também aparece em outros lugares no arquivo de origem. Existe uma razão para fazer isso que estou perdendo?
Por exemplo, se eu fizer
[OP@localhost executable]$ cat garbage
lalala
trololol
[OP@localhost executable]$ chmod +x garbage
[OP@localhost executable]$ ./garbage
./garbage: line 1: lalala: command not found
./garbage: line 2: trololol: command not found
Bash parece estar tentando interpretar este "executável" como um script. No entanto, há duas instâncias em que isso claramente não acontece: quando o arquivo começa com um #!
, e arquivos ELF. Existem mais? Existe uma documentação abrangente disso em algum lugar?
FHS-3.0 descreve-o como:
Dados compartilháveis e somente leitura. Isso significa que
/usr
deve ser compartilhável entre vários hosts compatíveis com FHS e não deve ser gravado.
Estou um pouco confuso com o que isso significa. Isso significa que os binários ou quaisquer outros arquivos internos devem ser copiados e colados em outra máquina e que funcionem perfeitamente?
No livro The Linux Programming Interface , diz
O kernel impõe limites ao número de desreferências para lidar com a possibilidade de cadeias circulares de links simbólicos.
Onde posso encontrar esse limite?
[fakename]$ nice yes a>/dev/null &
[1] 26475
[fakename]$ ps -p 26475 -o nice,pid
NI PID
10 26475
[fakename]$ nice { yes a>/dev/null; } &
-bash: syntax error near unexpected token `}'
Existe uma maneira de nice
um grupo de comando?
Estou ciente de um: para executar o grupo de comandos normalmente, coloque-o em segundo plano anexando um e comercial e use renice
no grupo de comandos. No entanto, existe uma maneira de fazer a mesma coisa com nice
?
Além disso, por que exatamente está me dando esse erro? É porque nice
não é uma palavra-chave do shell e, portanto, deve seguir as regras padrão de análise de argumentos bash?
Por exemplo,
[fakename]$ type echo
echo is a shell builtin
Mas man echo
me dá a versão GNU coreutils do echo
. Qual é a maneira mais fácil de saber se a página de manual que estou olhando é a correta, ou seja, aquela para o utilitário que eu obteria se a invocasse diretamente?
[fakename]$ help time
time: time [-p] pipeline
Report time consumed by pipeline's execution...
A partir disso, parece que time
é um Bash embutido. No entanto, não consigo encontrar uma descrição dele nesta página: https://www.gnu.org/software/bash/manual/html_node/Shell-Builtin-Commands.html#Shell-Builtin-Commands . Por que este é o caso?