Jak rozchodit tlačítka na Zyxel NAS326

Raspberry, Arduino, Mini-PC a další

Moderátor: Moderátoři

Zpráva
Autor
Uživatelský avatar
lesana87
Příspěvky: 4395
Registrován: 20 zář 2014, 00:00

#76 Příspěvek od lesana87 »

Se mnou nějak nekamarádí.
Uživatelský avatar
lesana87
Příspěvky: 4395
Registrován: 20 zář 2014, 00:00

#77 Příspěvek od lesana87 »

asdf píše:To update last values asi může být v tom ifu, to je jedno. Klidně si to přehoď tam.

sd_time je zkratka spin down time. Tam je čas, kdy se ten disk naposledy uspal. To jsem potřeboval, aby se to neuspávalo každou sekundu, když disk není používán.
Je to rozbitý. Když se skript pustí ve chvíli, kdy už se na disk nepřistupuje, tak se nikdy neuspí.
Pořešila jsem to změnou inicializace na:

Kód: Vybrat vše

sd_time=0
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#78 Příspěvek od asdf »

Tak jsem to trochu spravil.
- Místo sd_time jsem tam dal příznak, jestli se disk točí. (To mi to včera nějak nemyslelo.)
- Přejmenoval jsem jednu proměnnou.
- Přidal jsem sledování těch discard operací.
Snad to teď poběží líp.

Kód: Vybrat vše

#!/bin/bash
# Usage: spindown sda 10 - spins down after 10 seconds

# Remember arguments.
disk=$1
timeout=$2
if test -z "$disk"
then
	echo "Disk not defined." >&2
	exit 1
fi
if test -z "$timeout"
then
	echo "Timeout not defined." >&2
	exit 1
fi

# Initial values.
last_read=0
last_write=0
last_discard=0
io_time=$(date '+%s')
spinning=1

# Loop.
while true
do
	# Get current values.
	time=$(date '+%s')
	read=$(cat /sys/block/$disk/stat | awk '{ print $1 }')
	write=$(cat /sys/block/$disk/stat | awk '{ print $5 }')
	discard=$(cat /sys/block/$disk/stat | awk '{ print $12 }')

	# Test if there is a change.
	if test $read -ne $last_read -o $write -ne $last_write -o $discard -ne $last_discard
	then
		# Change found, update io_time.
		if test $spinning = 0
		then
			# Was not spinning, just spinning up.
			echo "Spinning up." >&2
		fi
		io_time=$time
		spinning=1
	fi

	# Update last values.
	last_read=$read
	last_write=$write
	last_discard=$discard
	
	# Test if in idle too long.
	time_idle=$(( $time - $io_time ))
	echo "Idle for seconds: $time_idle" >&2
	if test $time_idle -ge $timeout -a $spinning = 1
	then
		# Idle too long. Spin down.
		echo "Spinning down." >&2
		#hdparm -y /dev/$disk
		spinning=0
	fi
	
	# Wait a second.
	sleep 1
done
Uživatelský avatar
lesana87
Příspěvky: 4395
Registrován: 20 zář 2014, 00:00

#79 Příspěvek od lesana87 »

Hraju si tu s těma skriptama a zjistila jsem, že ten power_button.sh mi tam běží dvakrát. Spouštím ho z /etc/rc.local a po něm hdsleep.sh. Po náběhu systému mi ps -A ukáže, že běží

Kód: Vybrat vše

 2419 ?        00:00:00 power_button.sh
 2420 ?        00:00:02 hdsleep.sh
 2425 ?        00:00:00 power_button.sh
 2426 ?        00:00:00 od
 2427 ?        00:00:00 awk
 2440 ttyS0    00:00:00 getty
 2563 pts/1    00:00:00 bash
a jako nejnovější proces se stále spouští ten sleep z hdsleep.sh. To neustálé spouštění sleepu beru jako cenu za to, že to běží jako skript, ale proč ten power_button běží dvakrát? Když zmáčknu některé tlačítko, ta druhá instance se ukončí a spustí se znovu.
Takže pak to vypadá nějak takhle:

Kód: Vybrat vše

 2419 ?        00:00:00 power_button.sh
 2420 ?        00:00:02 hdsleep.sh
 2440 ttyS0    00:00:00 getty
 2563 pts/1    00:00:00 bash
 6601 ?        00:00:00 power_button.sh
 6602 ?        00:00:00 od
 6603 ?        00:00:00 awk
14287 ?        00:00:00 sleep
14288 pts/1    00:00:00 ps
Ví někdo, proč ten power_button.sh běží dvakrát? Ten sleep mě trochu znervózňuje, jde to řešit jinak?
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#80 Příspěvek od asdf »

A není to tou konstrukcí "<( ... )"?
Já bych zkusil místo

Kód: Vybrat vše

readarray -d\  event < <(od -A n -t u2 -N 16 /dev/input/event0 | awk '{print $1, $2, $5, $6, $7}')
dát

Kód: Vybrat vše

od -A n -t u2 -N 16 /dev/input/event0 | awk '{print $1, $2, $5, $6, $7}' | readarray -d\  event
Jestli ten extra proces nezmizí.

Ten sleep tam asi vždycky bude. Leda by se to přepsalo do C-čka.

Edit: Tak mi to s tím předěláním readarray na normální rouru nefunguje. Tak asi nic. Ale je to divný, normální read mi tak vždycky fungoval.
Uživatelský avatar
lesana87
Příspěvky: 4395
Registrován: 20 zář 2014, 00:00

#81 Příspěvek od lesana87 »

Teď jsem zjistila, že disky se mi zastavujou i bez toho skriptu a on mi tam běží ten hd-idle. 8O On se na Debianu automaticky nainstaluje do /etc/init.d a /etc/rc?.d. Tak asi proto při spuštění zůstával viset, protože už běžel na pozadí. :oops:
Takže asi je vše vyřešeno k mojí spokojenosti, víc už v tom radši vrtat nebudu. Děkuji všem za pomoc. :)
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#82 Příspěvek od asdf »

Takže dobré zprávy. :-)
Uživatelský avatar
lesana87
Příspěvky: 4395
Registrován: 20 zář 2014, 00:00

#83 Příspěvek od lesana87 »

Jo, už tam hrnu data. :)
Odpovědět

Zpět na „Miniaturní počítače (Arduino, Raspberry a další)“