Uma reinicialização completamente falsa [fechada]


21

Esse desafio é simples. Escreva um código que produz exatamente o que se parece com uma reinicialização completa do computador. Ele não deve mostrar nada na tela que indique que não é uma reinicialização real e deve terminar na tela de logon normal que você obteria após a reinicialização.

Regras.

  1. Você pode escolher qualquer sistema operacional que queira imitar. Por exemplo, você pode reiniciar o Linux no Windows ou qualquer outra combinação que escolher.
  2. O código deve exibir a seqüência completa de desligamento / reinicialização em tela cheia, sem sinais de que não é real.
  3. Este é um concurso de popularidade, portanto, quanto mais frio, melhor.
  4. Na realidade, o código deve ser completamente inofensivo, não é necessário reiniciar e é fácil sair a qualquer momento.
  5. Se você precisar usar imagens externas para tornar a reinicialização mais realista, seu código deverá capturá-las automaticamente na Web.
  6. Seu código deve ser independente, baseando-se apenas em bibliotecas ou ferramentas padrão disponíveis gratuitamente, e facilmente executável seguindo as instruções fornecidas.
  7. Boa sorte!

Por se tratar de um concurso de popularidade, concederei a vitória à resposta com o maior número de votos em 1º de junho de 2014.


Após uma solicitação para restringir a pergunta, aqui está uma regra adicional.

  • O sistema deve imitar qualquer versão do Windows ou as distribuições Mint, Ubuntu, Debian, Fedora, Archlinux ou Mageia do Linux ou OS X. Para maior frescura, você deve desligar um e abrir no outro.

As pessoas interessadas podem querer ver Pitch dark (lembrança da Hora do Planeta), onde são sugeridas várias maneiras de usar a tela inteira, mesmo quando se inicia um xterm.


2
Tal como está, essa questão é muito ampla. Ao não restringir o sistema que deve ser falsificado, ele se depara com (pelo menos - esta lista pode não ser exaustiva): a) com sistemas antigos baseados em ROM que são reiniciados instantaneamente e podem ser falsificados exibindo uma imagem; b) determinar se um falso atende ou não aos critérios de aceitação quando, por exemplo, o computador em que o estou executando é multi-cabeçote e o sistema operacional falso não suporta multi-cabeçote (ou qualquer cabeçote).
Peter Taylor

@ PeterTaylor Eu esperava que as respostas do tipo a) recebessem votos baixos e, como é um concurso de popularidade, tudo bem. Se você pudesse me ajudar a refiná-lo para lidar com o ponto b), ficaria muito grato.

A solução óbvia para o problema b) é restringir a questão dizendo que sua solução só precisa funcionar no sistema que imita e restringindo os sistemas que podem ser imitados. Mas, mesmo assim, muitas tentativas estão fadadas ao fracasso pela variedade de BIOSs disponíveis para máquinas compatíveis com IBM.
Peter Taylor

@PeterTaylor Thanks. Eu reduzi bastante o escopo. Como está agora?

Gah, eu quase tive uma solução perfeita para o ArchLinux puro (sem inicialização, apenas mensagens do kernel e BIOS). Devo dizer que nunca entendi o ponto de desperdiçar ciclos de CPU na inicialização apenas para exibir alguns gráficos bonitos.
semi-extrínseco

Respostas:


18

zsh + coreutils + unclutter + amixer + xterm (Arch Linux)

Peguei a resposta do @ TheDoctor e corri com ela. Esta versão possui muitas melhorias e é 99% convincente para um usuário experiente (eu) no meu sistema Arch Linux. Eu uso o Zsh, pois ele possui um bom suporte de matriz e número de ponto flutuante.
Dependências: feh, unclutter, amixer, zsh, xterm

Melhorias:

1) Use o número impresso na primeira coluna por dmesg, que é o tempo desde a inicialização (por exemplo, [0,000000]) para determinar o tempo de espera. Sem isso, parece muito irreal na minha máquina. Esses horários são analisados ​​antes do loop (em uma chamada inicial para suspensão), pois a análise dentro do loop é muito lenta.

2) Não imprima linhas onde o tempo de inicialização é maior que 16 segundos. Esse número específico depende da máquina, mas o objetivo é evitar a impressão de coisas dmesg posteriores que sejam inseridas / removidas de pen drives, etc. e não estejam relacionadas à inicialização.

3) Faça tudo isso em uma janela de terminal em tela cheia com fundo preto e texto em branco. Parabéns ao Mechanical Snail por este truque usado em: Faça uma imagem PNG com "Hello World!" com APIs de programação, no menor código possível

4) Silencie o áudio no desligamento, restaure o volume quando o script terminar.

5) Oculte o cursor do mouse, restaure quando o script terminar.

6) Mostre as telas iniciais do BIOS e do Syslinux.

Correr com: xterm -fu -fg white -bg black -e '/ usr / bin / zsh fake-reboot.sh'

Código:

#!/usr/bin/zsh
# Remove (undisplay) the mouse pointer
unclutter -idle 0 -jitter 255 &
# Since there is no easily-accessible (i.e. without being root) shutdown log, we
# fake these messages.
echo "The system is going down for maintenance NOW."
sleep 2.0
echo "[21656.404742] systemd[1]: Shutting down."
echo "[21656.404742] systemd[1]: Stopping Session 1 of user `id -u -n`."
echo "[21656.404742] systemd[1]: Stopped Session 1 of user `id -u -n`."
echo "[21656.404742] systemd[1]: Stopping Sound Card."
# For added effect, store volume and then mute sound
volume=`amixer -- sget Master | awk -F'[][]' 'END{print $2}'`
amixer -- sset Master 0% &> /dev/null
echo "[21656.404742] systemd[1]: Stopped target Sound Card."
sleep 0.5
echo "[21656.919792] systemd[1]: Stopping system-systemd\x2dfsck.slice."
echo "[21656.919792] systemd[1]: Removed slice system-systemd\x2dfsck.slice."
echo "[21656.919792] systemd[1]: Stopping system-netctl\x2difplugd.slice."
echo "[21656.919793] systemd[1]: Removed slice system-netctl\x2difplugd.slice."
echo "[21656.919793] systemd[1]: Stopping User Manager for UID `id -u`..."
sleep 0.7
echo "[21657.624741] systemd[1]: Stopping Graphical Interface."
echo "[21657.624742] systemd[1]: Stopped target Graphical Interface."
echo "[21657.624745] systemd[1]: Stopping Multi-User System."
sleep 0.9
echo "[21658.606561] systemd[1]: Stopped target Multi-User System."
echo "[21658.606562] systemd[1]: Stopping Paths."
echo "[21658.606562] systemd[1]: Stopped D-Bus System Message Bus."
echo "[21658.606562] systemd[1]: Stopped target Paths."
echo "[21658.606568] systemd[1]: Stopping Timers."
echo "[21658.606568] systemd[1]: Stopped target Timers."
echo "[21658.606568] systemd[1]: Stopping Sockets."
echo "[21658.606568] systemd[1]: Stopped target Sockets."
echo "[21658.606568] systemd[1]: Starting Shutdown."
echo "[21658.606571] systemd[1]: Reached target Shutdown."
echo "[21658.606571] systemd[1]: Starting Exit the Session..."
echo "[21658.606571] systemd[1]: Received SIGRTMIN+26 from PID 10988 (kill)."
echo "[21658.606571] systemd[1]: Deactivated swap."
sleep 0.4
echo "[21659.001741] systemd[1]: Starting Unmount All Filesystems."
echo "[21659.001742] systemd[1]: Unmounted /home."
echo "[21659.001742] systemd[1]: Reached target Unmount All Filesystems."
echo "[21659.001742] systemd[1]: Stopping Remount Root and Kernel File Systems..."
echo "[21659.001742] systemd[1]: Stopped Remount Root and Kernel File Systems."
echo "[21659.001743] systemd[1]: Reached target Shutdown."
echo "[21659.001743] systemd[1]: Starting Final Step."
echo "[21659.001743] systemd[1]: Reached target Final Step."
echo "[21659.001754] systemd[1]: Shutting down."
sleep 0.3
echo "[21659.304341] systemd-journal[250]: Journal stopped"
sleep 0.2
echo "System halted."
sleep 2
clear
sleep 1
# Get the BIOS splash screen and display it
wget http://pvv.ntnu.no/~asmunder/bios.jpg  &> /dev/null
feh -Z -x -F -N --force-aliasing bios.jpg &
pid=$! # Store PID of Feh, so we can kill it later
# While showing the BIOS splash, use the time to parse dmesg output into arrays
tim=`dmesg | awk '{print $2}' | sed 's/]//' | grep "[0-9][0-9][0-9][0-9][0-9]"`
tim=($=tim)
dmsg=("${(@f)$(dmesg)}")
sleep 2.5
kill $pid
sleep 0.5
# Get the Syslinux splash and display it
wget http://pvv.ntnu.no/~asmunder/syslinux.png  &> /dev/null
feh -Z -x -F -N --force-aliasing syslinux.png &
pid=$!
sleep 1.3
kill $pid
# Loop through the arrays we created. Calculate the time we have to wait before
# displaying this line. If the wait time is less than 0.1 sec, we skip waiting.
T1=0.0
T2=0.0
n=0
for d in $dmsg; do
  T1=$T2
  T2=${tim[$n]}
  ((dT = $T2-$T1))
  if (( $dT > 0.1));then
    sleep $dT
  fi
  echo $d
  if (( $T2 > 16.0 )); then
    break
  fi
  ((n=$n+1))
done
sleep 1
clear
# It's normally agetty that parses /etc/issue and handles escape codes in a 
# special way. Thus we skip the first line of /etc/issue and do that manually.
echo "Arch Linux "`uname -r`" (tty1)"
tail -n +2 /etc/issue 
echo `hostname`" login:"
sleep 10
# Reset the mouse pointer so it is visible again
unclutter -idle 5 -jitter 0 &
# Reset the audio volume
amixer -- sset Master $volume &> /dev/null

3
Isso é realmente bom e, de longe, o mais impressionante que pude testar até agora.

muito bom, muita tela de inicialização
Claudiu

Haha, você vinculou minha própria pergunta! Mas esse é um código muito bom lá. Eu vou tentar.
figgycity50

cat /etc/issue | tail -n +2 : uso inútil de gato . tail -n +2 /etc/issueé mais simples, especialmente quando não há pipeline.
Peter Cordes

Bom ponto. Corrigido e os links quebrados.
semi-extrínseco

12

Comodoro 64

1?CHR$(147)
2?"    **** COMMODORE 64 BASIC V2 ****"
3?
4?" 64K RAM SYSTEM  38911 BASIC BYTES FREE"

O intérprete BASIC exibirá o READY.prompt automaticamente.


2
Sugiro alterar a linha 1 para: 1 POKE 53280,6:POKE 53281,14:?CHR$(159):?CHR$(147) ... para garantir que as cores estejam corretas.
Mark

+1 por trazer uma lágrima aos meus olhos, mesmo que ela não atenda às regras.
ClickRick

10

TI-Basic

AxesOff
GridOff
LabelOff
CoordOff
ClrDraw
DispGraph
ClrHome

2
No meu Ti-83 Plus mostra "Done", não sei se isso quebra as regras ...
Joshua

11
Para evitar o "Concluído", você deve adicionar uma linha extra com uma aspas simples.
Timtech # 03

Isso não simula uma reinicialização. Se você pressionar 2ND + ON e LIGAR novamente, você só colocará o dispositivo em modo de espera e o despertar exibirá (na maioria dos casos) a tela que você tinha ao colocá-lo em modo de espera. Uma reinicialização real é mais difícil de fazer. Existem maneiras de fazer isso sem remover a bateria, mas essa é a mais fácil. Então, o que você vê após trocar as baterias é o que o programa deve simular. Isso é mais difícil, mas também possível no TI-Basic.
Fabian Röling

10

Bash + Coreutils (Linux)

echo "The system is going down for maintenance NOW."
clear
sleep 5
dmesg|while read i; do echo "$i"; sleep 0.1; done
cat /etc/issue
login

Isso é bom se executado a partir de um terminal virtual. Existe alguma maneira de torná-lo em tela cheia se for iniciado em um xterm? Suponho que nesse ponto você esteja basicamente implementando um protetor de tela.

@Lembik xterm -fullscreen?


Tentei no Mac; não funciona
Jwosty

2
@Jwosty No OS X (Mavericks, 10.9), você precisa ter privilégios de superusuário, então substitua dmesgpor sudo dmesg. Futhermore / etc / issue não existe no OS X.
CousinCocaine

5

Windows 8

Tentativa de má qualidade, não consigo descobrir como auto tela cheia. Eu tentei.

<!DOCTYPE html>
<html>
<body>

<iframe width="1600" height="900" src="http://www.youtube.com/embed/VgQ87b7muWs?start=510&end=524&autoplay=1" frameborder="0" allowfullscreen></iframe> 

</body>
</html>

3
Você pode tentar procurar a API HTML5 Element.RequestFullScreen()( developer.mozilla.org/pt-BR/docs/Web/Guide/API/DOM/… )
Ismael Miguel

4

Python / Pygame OSX

import pygame, time, os, urllib # Import Modules
pygame.init() # Initalise Pygame
pygame.mouse.set_visible(0) # Hide the Cursor
stdscr = pygame.display.set_mode((1280,800),pygame.FULLSCREEN) # Set up the display
stdscr.fill((255,255,255)) # Fill the screen white
urllib.urlretrieve("http://harrybeadle.github.io/FakeRestart/apple.bmp", "apple.bmp") # Get Apple Logo
urllib.urlretrieve("http://harrybeadle.github.io/FakeRestart/startup.wav", "startup.wav") # Get Startup Sound
time.sleep(1) # Wait for 1 second, screen still black
applelogo = pygame.image.load('apple.bmp').convert() # Load the Logo
pygame.mixer.music.load('startup.wav') # Load the Bung
stdscr.blit(applelogo,(580, 340)) # Blit the logo
pygame.mixer.music.play(1) # Play the sound
pygame.display.flip() # Flip the buffers
time.sleep(5) # Wait 5 seconds
pygame.quit() # Quit the pygame window
os.remove('apple.bmp') # Delete logo
os.remove('startup.wav') # Delete bung
os.system('/System/Library/CoreServices/"Menu Extras"/User.menu/Contents/Resources/CGSession -suspend') # Lock the Mac

Agora Atualizado!

Recursos:

  • Tela em branco
  • Tela branca com logotipo da Apple e som Bung
  • Recursos baixados do GitHub usando urlib
  • Bloqueia o Mac do usuário, preservando qualquer trabalho usando um comando terminal e os.system()

Agradável. Nitpick menor - as regras dizem: "Se você precisar usar imagens externas para tornar a reinicialização mais realista, seu código deverá capturá-las automaticamente da Web".
semi-extrínseco

@ semi-extrínseco Olhei para ele, é mais incômodo do que vale a pena, eu tive que editar a imagem de qualquer maneira e o Pygame não é amigável com nenhum tipo de arquivo que não seja um Bitmap do Windows, então acho que deixo como está por enquanto.
Harry Beadle

11
@ Sucata semi-extrínseca meu comentário anterior, funcionalidade adicionada.
Harry Beadle

Isso mostra apenas o logotipo da maçã em tela cheia por alguns segundos. Ele definitivamente precisa do "Bung" :)

@Lembik eu adicionei que agora, juntamente com mover os bens para GitHub para a confiabilidade :)
Harry Beadle

2

Este faz linux com os parâmetros "quiet" e "init = / bin / sh"

#!/bin/sh
echo shutting down
sleep 1
clear
echo Press F12 to enter setup. #everyone forgets the BIOS
sleep 1
clear

geralmente os sistemas mostram uma imagem ou uma saída do console. e nem o bios de todos está no f12: P
masterX244 12/12

11
@ masterX244 - a imagem é uma opção de compilação configurável no linux. com quiet não há saída do kernel e com init = / bin / sh não há saída de inicialização porque o init é simplesmente iniciar um shell. Você deve experimentá-lo em algum momento e ver exatamente o que é necessário para iniciar o X. Com o devtmfs + automount ativado, posso chegar ao X em menos de 0,2 segundo com um liner.
technosaurus

ahh, não uma configuração comum é por isso que eu comentei
masterX244
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.