View Full Version : Script start e stop
Ciao a tutti, sono nuovo è ho un problema con un script da me modificato, spero possiate aiutarmi!
Sto utilizzando raspbian su un raspberry pi model B.
Ho creato uno script chiamato "prova.sh" inserito nella cartella /etc/init.d; tale script mediante il comando start si avvia ed esegue all'infinito un file chiamato mysql.php, con il comando stop si ferma. Il file php si occupa di salvare dei dati acquisiti da seriale su un database mysql continuativamente; tutto sembra funzionare alla perfezione. Dopo qualche decina di minuti di funzionamento smette di salvare i dati sul database remoto, ma apparentemente (testandone il PID) lo script sembra essere in run, infatti è comunque stoppabile. Inoltre, quasi sempre, qualche ora dopo i dati ricominciano ad arrivare senza problemi per poi interrompersi qualche decina di minuti dopo.
Di seguito posto il codice dello script, mentre ritengo non necessario il codice php (se dovesse servire ditelo):
lockFile=/home/pi/prova.pidif [ -f $lockFile ]; then
CPID="`cat $lockFile`"
fi
looping ()
{
while true # To infinity ... and beyond!
do
php /var/www/mysql/mysql.php
done
}
case $1 in
start)
if [ ! -f $lockFile ]; then
echo "Starting script.."
looping &
echo $! > /home/pi/prova.pid
else
echo "Script is already started as PID:$CPID"
fi
;;
stop)
if [ -f $lockFile ]; then
kill -9 $CPID
rm $lockFile
sleep 1
echo "Stopping Script"
else
echo "Script was already stopped"
fi
;;
admin)
;;
*)
clear
echo "
Usage: Script { start | stop }
"
;;
esac
exit 0
Spero vivamente possiate aiutarmi, grazie in anticipo.
Gimli[2BV!2B]
04-10-2013, 22:07
Ci sono messaggi di errore nei log di MySQL?
Da come descrivi il problema mi vien da pensare all'esaurimento delle connessioni contemporanee offerte da MySQL, ma non dovrebbe succedere, a meno che lo script php non sia particolarmente estroso.
Quanto tempo passa tra un inserimento di dati ed il successivo? Come viene implementata l'attesa?
Hai provato ad eseguire la funzione looping in un terminale per vedere se ottieni qualche messaggio di errore dopo qualche minuto?gimli@sertan ~ $ looping () { while true ; do php /var/www/mysql/mysql.php ; done; }
gimli@sertan ~ $ looping
Qualche interrogazione per controllare i valori relativi al numero di connessioni possibili (max_connections), aperte (Threads_connected), massime aperte contemporaneamente (Max_used_connections).gimli@sertan ~ $ mysql -uroot -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 4
Server version: 5.5.32-MariaDB-log Source distribution
Copyright (c) 2000, 2013, Oracle, Monty Program Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
1 row in set (0.00 sec)
MariaDB [(none)]> show global status like 'Threads_connected';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 1 |
+-------------------+-------+
1 row in set (0.00 sec)
MariaDB [(none)]> show global status like 'Max_used_connections';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Max_used_connections | 2 |
+----------------------+-------+
1 row in set (0.00 sec)
Ti ringrazio della risposta. Facendo il loop da terminale, come da te indicato si comporta allo stesso modo. Errori in output da database Mysql non ne ricevo, nonostante abbia implementato il codice di cattura eccezione da php.
Il codice di connessione al database è il seguente:
try
{
$pdo = new PDO($host,'$user','$pw');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec('SET NAMES "utf8"');
}
catch (PDOException $e)
{
echo($e);
}
Come prova, proprio per capire la provenienza del problema, ho deciso di non implementare un tempo di attesa nel codice PHP; ma faccio rifare la connessione al database Mysql ogni ciclo, la quale viene poi lasciata chiudere automaticamente ad ogni fine esecuzione del file PHP. Il tutto dura 1 secondo circa.
Questo è il risultato dei 3 comandi di test:
mysql> show variables like 'max_connections';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
1 row in set (0.00 sec)
mysql> show global status like 'Threads_connected';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Threads_connected | 3 |
+-------------------+-------+
1 row in set (0.00 sec)
mysql> show global status like 'Max_used_connections';
+----------------------+-------+
| Variable_name | Value |
+----------------------+-------+
| Max_used_connections | 4 |
+----------------------+-------+
1 row in set (0.00 sec)
mysql>
A titolo di prova ho avviato il codice questa notte, implementando un ritardo di 3 minuti circa tra un ciclo è l'altro. Apparentemente tutto sembra funzionare, dunque il problema potrebbe effettivamente essere imputabile al numero di connessioni, ma non essendo mai contemporanee per le ragioni spiegate prima non saprei trovare una soluzione.
Codice con il ritardo:
looping ()
{
while true # To infinity ... and beyond!
do
php /var/www/mysql/mysql.php
sleep 177;
done
}
Gimli[2BV!2B]
05-10-2013, 10:41
L'esecuzione dovrebbe procedere in questo modo:
la funzione looping lancia php e rimane in attesa
php si connette a MySQL
inserimento dati e/o calcoli
termine esecuzione script php e disconnessione da database MySQL
Immagino che i tre SHOW su MySQL li abbia eseguiti durante l'esecuzione della versione problematica o dopo il manifestarsi del problema.
In tal caso, come puoi vedere, i valori sono normalissimi.
Altra idea: l'utente in uso ha qualche limite orario impostato? Si tratta di valori che *non* dovrebbero essere impostati automaticamente alla creazione di un utente.
Esempio di interrogazione ed impostazione:MariaDB [mysql]> SELECT user, max_questions, max_updates, max_connections FROM mysql.user WHERE user = 'user1';
+-------+---------------+-------------+-----------------+
| user | max_questions | max_updates | max_connections |
+-------+---------------+-------------+-----------------+
| user1 | 0 | 0 | 0 |
+-------+---------------+-------------+-----------------+
1 row in set (0.00 sec)
MariaDB [mysql]> GRANT USAGE ON *.* TO 'user1'@'localhost' WITH MAX_QUERIES_PER_HOUR 2000 MAX_UPDATES_PER_HOUR 1000;
Query OK, 0 rows affected (0.00 sec)
MariaDB [mysql]> SELECT user, max_questions, max_updates, max_connections FROM mysql.user WHERE user = 'user1';
+-------+---------------+-------------+-----------------+
| user | max_questions | max_updates | max_connections |
+-------+---------------+-------------+-----------------+
| user1 | 2000 | 1000 | 0 |
+-------+---------------+-------------+-----------------+
1 row in set (0.00 sec)
Esatto, il funzionamento dello script è esattamente quello.
Adesso ho provvisoriamente risolto facendolo eseguire ogni 2 minuti invece che in tempo reale ogni secondo.
Ormai è tutto il week end che funziona ininterrottamente, quindi il problema potrebbe effettivamente essere imputabile al numero massimo di connessioni possibili in un certo intervallo di tempo, purtroppo non so come cambiarne il valore. Sapresti aiutarmi?
Grazie e scusa per il ritardo nella risposta.
Gimli[2BV!2B]
07-10-2013, 20:08
Hai provato le due select che ho scritto nell'ultimo post?
Ovviamente devi sostituire il mio utente di esempio user1 con l'utente usato dallo script.
Altra idea: hai qualche firewall impostato?
Per vedere un elenco delle regole ipv4 attive:iptables -v -nL
Per finire, messaggi sospetti in dmesg?
Come prima prova ho fatto le query da te indicate:
mysql> SELECT user, max_questions, max_updates, max_connections FROM mysql.user WHERE user = 'root';
+------+---------------+-------------+-----------------+
| user | max_questions | max_updates | max_connections |
+------+---------------+-------------+-----------------+
| root | 0 | 0 | 0 |
| root | 0 | 0 | 0 |
| root | 0 | 0 | 0 |
| root | 0 | 0 | 0 |
| root | 0 | 0 | 0 |
| root | 0 | 0 | 0 |
+------+---------------+-------------+-----------------+
6 rows in set (0.00 sec)
mysql> GRANT USAGE ON *.* TO 'root'@'localhost' WITH MAX_QUERIES_PER_HOUR 2000 MAX_UPDATES_PER_HOUR 1000;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT user, max_questions, max_updates, max_connections FROM mysql.user WHERE user = 'root';
+------+---------------+-------------+-----------------+
| user | max_questions | max_updates | max_connections |
+------+---------------+-------------+-----------------+
| root | 2000 | 1000 | 0 |
| root | 0 | 0 | 0 |
| root | 0 | 0 | 0 |
| root | 0 | 0 | 0 |
| root | 0 | 0 | 0 |
| root | 0 | 0 | 0 |
+------+---------------+-------------+-----------------+
6 rows in set (0.00 sec)
mysql>
Per le varie prove ho utilizzato l'utente root, ovviamente provvederò ad una gestione utenti quando funzionerà tutto. Suppongo ora di dover provare lo script in tempo reale, domani mattina lo avvio e vediamo se è risolto, dovrei aggiornare tutte le righe root ai valori da te indicati?
Per quanto riguarda il comando ipv4 non so bene cosa mi stai facendo fare, in qualunque caso ricevo un errore poco rassicurante:
dbmysql@mysql:~$ iptables -v -nL
FATAL: Error inserting ip_tables (/lib/modules/3.2.0-53-generic-pae/kernel/net/ipv4/netfilter/ip_tables.ko): Operation not permitted
iptables v1.4.12: can't initialize iptables table `filter': Table does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
Domani mattina quando avvierò lo script proverò a postare il risultato di dmesg, che adesso ritengo poco attendibile.
Grazie ancora della pazienza
Gimli[2BV!2B]
07-10-2013, 21:49
Non ho riletto quel che avevo scritto sabato, una delle due query impostava il limite, rimuovilo:GRANT USAGE ON *.* TO 'root'@'localhost' WITH MAX_QUERIES_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0;In ogni caso non era impostato.
Direi che iptables non è attivo.
dunque quei valori impostati a zero tolgono ogni limite al massimo numero di connessioni?
Gimli[2BV!2B]
08-10-2013, 20:10
Sì, anche quel limite non c'entra.
Qualche mese fa ho testato un plugin che registra le connessioni effettuate, bombardando un'istanza di MySQL a raffiche di 5500 connessioni in locale e remoto contemporaneamente: non faceva una piega. Non avevo fatto impostazioni particolari, quindi non riesco ad immaginare cosa possa darti questo problema. Potrebbe però anche essere un problema specifico ad architetture ARM...
Non è che è ciò con cui comunichi via seriale che si arrende dopo un po'?
Dubito ci possa essere un problema dal punto di vista seriale, avevo già fatto delle prove e mai nulla si era bloccato.
Ho notato una cosa strana però, potrebbe esserci qualche tipo di problema con i permessi di esecuzione dello script? E possibile che "perda" i permessi di esecuzione dopo un certo tempo?
questo è il risultato di dmesg qualche minuto dopo il bloccaggio dello script:
pi@raspberrypi ~ $ dmesg
[ 0.000000] Booting Linux on physical CPU 0
[ 0.000000] Initializing cgroup subsys cpu
[ 0.000000] Linux version 3.6.11+ (dc4@dc4-arm-01) (gcc version 4.7.2 2012073 1 (prerelease) (crosstool-NG linaro-1.13.1+bzr2458 - Linaro GCC 2012.08) ) #474 PREEMPT Thu Jun 13 17:14:42 BST 2013
[ 0.000000] CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr =00c5387d
[ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruc tion cache
[ 0.000000] Machine: BCM2708
[ 0.000000] cma: CMA: reserved 16 MiB at 1d000000
[ 0.000000] Memory policy: ECC disabled, Data cache writeback
[ 0.000000] On node 0 totalpages: 122880
[ 0.000000] free_area_init_node: node 0, pgdat c053b854, node_mem_map c05e500 0
[ 0.000000] Normal zone: 960 pages used for memmap
[ 0.000000] Normal zone: 0 pages reserved
[ 0.000000] Normal zone: 121920 pages, LIFO batch:31
[ 0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768
[ 0.000000] pcpu-alloc: [0] 0
[ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pag es: 121920
[ 0.000000] Kernel command line: dma.dmachans=0x7f35 bcm2708_fb.fbwidth=656 b cm2708_fb.fbheight=416 bcm2708.boardrev=0xe bcm2708.serial=0xf8d91084 smsc95xx.m acaddr=B8:27:EB:D9:10:84 sdhci-bcm2708.emmc_clock_freq=100000000 vc_mem.mem_base =0x1ec00000 vc_mem.mem_size=0x20000000 dwc_otg.lpm_enable=0 console=ttyAMA0,115 200 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 eleva tor=deadline rootwait
[ 0.000000] PID hash table entries: 2048 (order: 1, 8192 bytes)
[ 0.000000] Dentry cache hash table entries: 65536 (order: 6, 262144 bytes)
[ 0.000000] Inode-cache hash table entries: 32768 (order: 5, 131072 bytes)
[ 0.000000] Memory: 480MB = 480MB total
[ 0.000000] Memory: 464776k/464776k available, 26744k reserved, 0K highmem
[ 0.000000] Virtual kernel memory layout:
[ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB)
[ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB)
[ 0.000000] vmalloc : 0xde800000 - 0xff000000 ( 520 MB)
[ 0.000000] lowmem : 0xc0000000 - 0xde000000 ( 480 MB)
[ 0.000000] modules : 0xbf000000 - 0xc0000000 ( 16 MB)
[ 0.000000] .text : 0xc0008000 - 0xc04e647c (4986 kB)
[ 0.000000] .init : 0xc04e7000 - 0xc0507f24 ( 132 kB)
[ 0.000000] .data : 0xc0508000 - 0xc053c080 ( 209 kB)
[ 0.000000] .bss : 0xc053c0a4 - 0xc05e4758 ( 674 kB)
[ 0.000000] NR_IRQS:330
[ 0.000000] sched_clock: 32 bits at 1000kHz, resolution 1000ns, wraps every 4 294967ms
[ 0.000000] Console: colour dummy device 80x30
[ 0.000000] console [tty1] enabled
[ 0.001027] Calibrating delay loop... 697.95 BogoMIPS (lpj=3489792)
[ 0.060123] pid_max: default: 32768 minimum: 301
[ 0.060458] Mount-cache hash table entries: 512
[ 0.061214] Initializing cgroup subsys cpuacct
[ 0.061268] Initializing cgroup subsys devices
[ 0.061301] Initializing cgroup subsys freezer
[ 0.061330] Initializing cgroup subsys blkio
[ 0.061420] CPU: Testing write buffer coherency: ok
[ 0.061756] hw perfevents: enabled with v6 PMU driver, 3 counters available
[ 0.061899] Setting up static identity map for 0x39d698 - 0x39d6f4
[ 0.063391] devtmpfs: initialized
[ 0.074040] NET: Registered protocol family 16
[ 0.080482] DMA: preallocated 4096 KiB pool for atomic coherent allocations
[ 0.081580] bcm2708.uart_clock = 0
[ 0.082968] hw-breakpoint: found 6 breakpoint and 1 watchpoint registers.
[ 0.083022] hw-breakpoint: maximum watchpoint size is 4 bytes.
[ 0.083059] mailbox: Broadcom VideoCore Mailbox driver
[ 0.083154] bcm2708_vcio: mailbox at f200b880
[ 0.083253] bcm_power: Broadcom power driver
[ 0.083292] bcm_power_open() -> 0
[ 0.083318] bcm_power_request(0, 8)
[ 0.584007] bcm_mailbox_read -> 00000080, 0
[ 0.584051] bcm_power_request -> 0
[ 0.584078] Serial: AMBA PL011 UART driver
[ 0.584222] dev:f1: ttyAMA0 at MMIO 0x20201000 (irq = 83) is a PL011 rev3
[ 0.908056] console [ttyAMA0] enabled
[ 0.931698] bio: create slab <bio-0> at 0
[ 0.936584] SCSI subsystem initialized
[ 0.940680] usbcore: registered new interface driver usbfs
[ 0.946265] usbcore: registered new interface driver hub
[ 0.951858] usbcore: registered new device driver usb
[ 0.958212] Switching to clocksource stc
[ 0.962450] FS-Cache: Loaded
[ 0.965584] CacheFiles: Loaded
[ 0.980358] NET: Registered protocol family 2
[ 0.985638] TCP established hash table entries: 16384 (order: 5, 131072 bytes )
[ 0.993378] TCP bind hash table entries: 16384 (order: 4, 65536 bytes)
[ 1.000167] TCP: Hash tables configured (established 16384 bind 16384)
[ 1.006770] TCP: reno registered
[ 1.010023] UDP hash table entries: 256 (order: 0, 4096 bytes)
[ 1.015922] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[ 1.022510] NET: Registered protocol family 1
[ 1.027375] RPC: Registered named UNIX socket transport module.
[ 1.033417] RPC: Registered udp transport module.
[ 1.038139] RPC: Registered tcp transport module.
[ 1.042888] RPC: Registered tcp NFSv4.1 backchannel transport module.
[ 1.050000] bcm2708_dma: DMA manager at f2007000
[ 1.054791] bcm2708_gpio: bcm2708_gpio_probe c0515d98
[ 1.060258] vc-mem: phys_addr:0x00000000 mem_base=0x1ec00000 mem_size:0x20000 000(512 MiB)
[ 1.069407] audit: initializing netlink socket (disabled)
[ 1.075001] type=2000 audit(0.930:1): initialized
[ 1.196848] VFS: Disk quotas dquot_6.5.2
[ 1.200882] Dquot-cache hash table entries: 1024 (order 0, 4096 bytes)
[ 1.207946] FS-Cache: Netfs 'nfs' registered for caching
[ 1.213698] NFS: Registering the id_resolver key type
[ 1.218860] Key type id_resolver registered
[ 1.223155] Key type id_legacy registered
[ 1.227519] msgmni has been set to 939
[ 1.233041] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 2 52)
[ 1.240763] io scheduler noop registered
[ 1.244805] io scheduler deadline registered (default)
[ 1.249988] io scheduler cfq registered
[ 1.273979] Console: switching to colour frame buffer device 82x26
[ 1.285372] kgdb: Registered I/O driver kgdboc.
[ 1.292547] vc-cma: Videocore CMA driver
[ 1.298354] vc-cma: vc_cma_base = 0x00000000
[ 1.304929] vc-cma: vc_cma_size = 0x00000000 (0 MiB)
[ 1.312085] vc-cma: vc_cma_initial = 0x00000000 (0 MiB)
[ 1.328163] brd: module loaded
[ 1.337910] loop: module loaded
[ 1.343144] vchiq: vchiq_init_state: slot_zero = 0xdd000000, is_master = 0
[ 1.352553] Loading iSCSI transport class v2.0-870.
[ 1.360133] usbcore: registered new interface driver smsc95xx
[ 1.367923] dwc_otg: version 3.00a 10-AUG-2012 (platform bus)
[ 1.580581] Core Release: 2.80a
[ 1.585498] Setting default values for core params
[ 1.592003] Finished setting default values for core params
[ 1.804406] Using Buffer DMA mode
[ 1.809408] Periodic Transfer Interrupt Enhancement - disabled
[ 1.816921] Multiprocessor Interrupt Enhancement - disabled
[ 1.824195] OTG VER PARAM: 0, OTG VER FLAG: 0
[ 1.830227] Dedicated Tx FIFOs mode
[ 1.836389] dwc_otg: Microframe scheduler enabled
[ 1.836805] dwc_otg bcm2708_usb: DWC OTG Controller
[ 1.843538] dwc_otg bcm2708_usb: new USB bus registered, assigned bus number 1
[ 1.852676] dwc_otg bcm2708_usb: irq 32, io mem 0x00000000
[ 1.859921] Init: Port Power? op_state=1
[ 1.865558] Init: Power Port (0)
[ 1.870559] usb usb1: New USB device found, idVendor=1d6b, idProduct=0002
[ 1.879213] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber= 1
[ 1.888296] usb usb1: Product: DWC OTG Controller
[ 1.894863] usb usb1: Manufacturer: Linux 3.6.11+ dwc_otg_hcd
[ 1.902465] usb usb1: SerialNumber: bcm2708_usb
[ 1.909532] hub 1-0:1.0: USB hub found
[ 1.915152] hub 1-0:1.0: 1 port detected
[ 1.921111] dwc_otg: FIQ enabled
[ 1.921130] dwc_otg: NAK holdoff enabled
[ 1.921151] Module dwc_common_port init
[ 1.921376] Initializing USB Mass Storage driver...
[ 1.928283] usbcore: registered new interface driver usb-storage
[ 1.936096] USB Mass Storage support registered.
[ 1.942616] usbcore: registered new interface driver libusual
[ 1.950393] mousedev: PS/2 mouse device common for all mice
[ 1.958530] bcm2835-cpufreq: min=700000 max=700000 cur=700000
[ 1.966213] bcm2835-cpufreq: switching to governor powersave
[ 1.973647] bcm2835-cpufreq: switching to governor powersave
[ 1.980976] cpuidle: using governor ladder
[ 1.986742] cpuidle: using governor menu
[ 1.992353] sdhci: Secure Digital Host Controller Interface driver
[ 2.000178] sdhci: Copyright(c) Pierre Ossman
[ 2.006251] sdhci: Enable low-latency mode
[ 2.052548] mmc0: SDHCI controller on BCM2708_Arasan [platform] using platfor m's DMA
[ 2.063844] mmc0: BCM2708 SDHC host at 0x20300000 DMA 2 IRQ 77
[ 2.073642] sdhci-pltfm: SDHCI platform and OF driver helper
[ 2.086845] usbcore: registered new interface driver usbhid
[ 2.094317] usbhid: USB HID core driver
[ 2.104717] TCP: cubic registered
[ 2.111963] Initializing XFRM netlink socket
[ 2.120231] Indeed it is in host mode hprt0 = 00021501
[ 2.127293] NET: Registered protocol family 17
[ 2.142520] Key type dns_resolver registered
[ 2.152714] VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5
[ 2.174513] mmc0: read SD Status register (SSR) after 2 attempts
[ 2.193058] registered taskstats version 1
[ 2.201833] Waiting for root device /dev/mmcblk0p2...
[ 2.209164] mmc0: new high speed SDHC card at address 0002
[ 2.232390] mmcblk0: mmc0:0002 00000 7.32 GiB
[ 2.240165] mmcblk0: p1 p2
[ 2.357014] EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. O pts: (null)
[ 2.369230] VFS: Mounted root (ext4 filesystem) on device 179:2.
[ 2.377329] usb 1-1: new high-speed USB device number 2 using dwc_otg
[ 2.386236] Indeed it is in host mode hprt0 = 00001101
[ 2.400525] devtmpfs: mounted
[ 2.412747] Freeing init memory: 128K
[ 2.602718] usb 1-1: New USB device found, idVendor=0424, idProduct=9512
[ 2.611796] usb 1-1: New USB device strings: Mfr=0, Product=0, SerialNumber=0
[ 2.623062] hub 1-1:1.0: USB hub found
[ 2.629041] hub 1-1:1.0: 3 ports detected
[ 2.912613] usb 1-1.1: new high-speed USB device number 3 using dwc_otg
[ 3.042998] usb 1-1.1: New USB device found, idVendor=0424, idProduct=ec00
[ 3.051955] usb 1-1.1: New USB device strings: Mfr=0, Product=0, SerialNumber =0
[ 3.081349] smsc95xx v1.0.4
[ 3.157322] smsc95xx 1-1.1:1.0: eth0: register 'smsc95xx' at usb-bcm2708_usb- 1.1, smsc95xx USB 2.0 Ethernet, b8:27:eb:d9:10:84
[ 3.252789] usb 1-1.2: new full-speed USB device number 4 using dwc_otg
[ 3.379156] usb 1-1.2: New USB device found, idVendor=0403, idProduct=6001
[ 3.401954] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber =3
[ 3.415384] usb 1-1.2: Product: FT232R USB UART
[ 3.422003] usb 1-1.2: Manufacturer: FTDI
[ 3.442440] usb 1-1.2: SerialNumber: A10127QQ
[ 3.797162] udevd[154]: starting version 175
[ 4.948620] Registered led device: led0
[ 4.994454] usbcore: registered new interface driver usbserial
[ 5.064298] usbcore: registered new interface driver usbserial_generic
[ 5.201229] USB Serial support registered for generic
[ 5.417919] usbserial: USB Serial Driver core
[ 5.596339] usbcore: registered new interface driver ftdi_sio
[ 5.856903] USB Serial support registered for FTDI USB Serial Device
[ 5.964224] ftdi_sio 1-1.2:1.0: FTDI USB Serial Device converter detected
[ 6.074414] usb 1-1.2: Detected FT232RL
[ 6.080432] usb 1-1.2: Number of endpoints 2
[ 6.189858] usb 1-1.2: Endpoint 1 MaxPacketSize 64
[ 6.252625] usb 1-1.2: Endpoint 2 MaxPacketSize 64
[ 6.259378] usb 1-1.2: Setting MaxPacketSize 64
[ 6.341499] usb 1-1.2: FTDI USB Serial Device converter now attached to ttyUS B0
[ 6.393258] ftdi_sio: v1.6.0:USB FTDI Serial Converters Driver
[ 8.605924] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)
[ 9.004455] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)
[ 17.885802] smsc95xx 1-1.1:1.0: eth0: link up, 100Mbps, full-duplex, lpa 0xCD E1
[ 22.560331] Adding 102396k swap on /var/swap. Priority:-1 extents:2 across:5 07900k SS
Ho inoltre fatto un'altra prova, al posto di salvare su database ho provato a salvare su file di testo. In entrambi i casi avviene l'arresto anomalo.
Non so proprio più dove guardare
Gimli[2BV!2B]
09-10-2013, 20:15
Considerando l'ultima affermazione escluderei che il problema sia in MySQL.
Puoi postare lo script php?
diventa un po' lungo copiare tutto il codice, molto lungo.
#!/usr/bin/php
<?php
include("config.php");
//Leggo il contenuto del file per verificarne lo stato di errore
$file_err=fopen("/var/www/mysql/file_err.txt","r+");
$err=file("/var/www/mysql/file_err.txt");
fclose($file_err);
//connessione al database con cattura eccezione
try
{
$pdo = new PDO($host,'******','*****');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->exec('SET NAMES "utf8"');
if($err[0]==0){
for($i=2;$i<=$n_inv+1;$i++){ //ciclo per il numero di inverter
include("leggiseriale.php");
include("caricasql.php");
}
}
elseif($err[0]==1){
include("caricafile.php");
$file_rete=fopen("/var/www/mysql/file_rete.txt","w+");
fclose($file_rete);
for($i=2;$i<=$n_inv+1;$i++){ //ciclo per il numero di inverter
include("leggiseriale.php");
include("caricasql.php");
}
$file_err=fopen("/var/www/mysql/file_err.txt","w+");
fwrite($file_err, "0");
fclose($file_err);
}
}
catch (PDOException $e)
{
//scrivo nel file di errore che c'è stato un errore
$file_err=fopen("/var/www/mysql/file_err.txt","w+");
fwrite($file_err, "1");
fclose($file_err);
for($i=2;$i<=$n_inv+1;$i++){ //ciclo per il numero di inverter
include("leggiseriale.php");
include("salvafile.php");
}
}
?>
ci sono i vari file inclusi che fanno ciò che è descritto dal nome. Questa è la prima pagina iniziale, c'è la connessione al database e una semplice gestione errori tramite salvataggio su file; in pratica se manca la connessione salva su un file di testo e carica appena la connessione ritorna. Il tutto si occupa di leggere da seriale di un inverter.
Stavo cercando di capire se esiste un modo per registrare nello script bash un log di eventi generati da lui stesso. Per poter eventualmente capire dove va in errore. Conosci qualcosa di simile?
Gimli[2BV!2B]
10-10-2013, 20:10
Essendo uno script php Bash non c'entra praticamente nulla.
Non considero php lo strumento migliore per creare script generici, ma è questione di gusti e fluenza nel linguaggio.
Hai attivato i messaggi di errore in PHP?
Controlla queste variabili abbiano questo valore nel tuo file php-cli.ini (se esiste è specifico per l'esecuzione da terminale) o php.ini (dovrebbero trovarsi da qualche parte nella cartella /etc/phpN/ con N correlato alla versione installata):error_reporting = E_ALL
display_errors = OnInoltre nel codice non deve essere presente questa dichiarazione:error_reporting(0);Non sono a conoscenza ne ho trovato uno strumento che possa analizzare l'esecuzione senza modificare il codice, ma ribadisco che la mia conoscenza del linguaggio php è piuttosto limitata.
Un paio di cose riguardo al codice
leggiseriale.php e caricasql.php hanno un po' di gestione degli errori? Lanciano thread figli e/o aprono "file globali" come /var/www/mysql/file_err.txt?
L'eccezione PDOException contiene un'utile descrizione dell'errore riscontrato, perché non scriverlo? (lo stesso vale per ogni altra eventuale eccezione catturata in altri punti)catch (PDOException $e)
{
//scrivo nel file di errore che c'è stato un errore
$file_err=fopen("/var/www/mysql/file_err.txt","w+");
fwrite($file_err, $e->getMessage());
fclose($file_err);
}La lettura avviene anche in caso di errore di connessione?
Si, il PHP non è così immediato per uno script di questo tipo, ma ritengo sia il miglior strumento per eseguire uno script e interfacciarsi con una pagina html di visualizzazione dati.
Veniamo ai consigli:
I messaggi di errore di PHP li ho attivati dal file da te indicatomi, a scopo informativo si trova in /etc/php5/cgi, si chiama php.ini. Ma come si visualizzano gli errori riportati? li restituisce nel terminale?
L'errore $e l'ho sempre visualizzato, per qualche motivo l'ho tolto dal codice, probabilmente stavo facendo delle prove. I file inclusi hanno una gestione errori, in particolare catturo il tentativo fallito di effettuare la query sul server mysql.
Per quanto riguarda la lettura da seriale, utilizzo una stringa di comando da passare alla shell di linux, che a sua volta va a eseguire la libreria scritta in c++ che interroga il dispositivo seriale. Il metodo più veloce è di postare una parte di codice di acquisizione da seriale:
//acquisizione serial number
$serialn="comando da eseguire nella shell";
$serialnreturn = shell_exec($serialn);
$serialnarray = preg_split('/[[:space:]]+/', $serialnreturn);
in effetti questa parte è l'unica a non avere una gestione errori. L'unico modo per gestire questo tipo di errore sarebbe quello di interpretare correttamente il contenuto di $serialn in caso errore.
Nelle mie prove ho comunque già visualizzato a terminale il contenuto di tale variabile, notando che durante il blocco improvviso dello script non restituisce errori.
Adesso sto modificando il codice per salvare uno storico di tutti le eccezioni catturate:
-quella di mancata connessione al database mysql (l'interrogazione seriale avviene comunque e senza errori in caso di errore di connessione al database, in quanto mi è utile salvare il tutto in un file di testo e inviarne il contenuto al ritorno della connessione).
-l'eccezione di query fallita.
-lo storico di tutti gli errori di acquisizione da seriale.
Da qui in avanti le mie capacità finisco e non so più dove sbattere la testa, spero di essere stato discretamente chiaro nonostante l'ora.:muro:
Gimli[2BV!2B]
13-10-2013, 12:55
Proposta di controllo output passthru:<?php
//acquisizione serial number
$serialn="ls -la 2>&1"; //Nota le redirezione dello stderr in stdout
ob_start();
$return_var = (int)1;
passthru($serialn, $return_var);
$serialnreturn = ob_get_clean();
echo "Output: \n".$serialnreturn."\n"; //Output di debug, eliminabile
echo "Return value: ".$return_var."\n"; //Output di debug, eliminabile
if( $return_var === 0 ) //Nessun errore
$serialnarray = preg_split('/[[:space:]]+/', $serialnreturn);
else
echo "ERROR!\n";
?>
Esempio di esecuzione con successo:gimli@sertan ~/Desktop $ php test.php
Output:
totale NN
drwxr-xr-x 2 gimli gimli 4096 13 ott 13.40 .
drwxr-xr-x 79 gimli gimli 4096 13 ott 13.19 ..
-rw-r--r-- 1 gimli gimli 65 25 gen 2009 .directory
-rw-r--r-- 1 gimli gimli 366 13 ott 13.45 test.php
Return value: 0Esempio di output con errore (ls -la INESISTENTE 2>&1):gimli@sertan ~/Desktop $ php test.php
Output:
ls: impossibile accedere a INESISTENTE: File o directory non esistente
Return value: 2
ERROR!Ovviamente questo flusso necessita che il programma C++ abbia valori di ritorno standard corretti o che abbia almeno un valore di ritorno in caso di successo ed uno diverso in caso di errore.
Ho implementato la gestione errori similmente a come tu hai consigliato. Per adesso funziona, sto intercettando tutti gli errori possibili.
Ho il sospetto che a questo punto funzioni tutto correttamente, in quanto non si è più bloccato; suppongo che quindi il problema fosse dovuto a una cattura di errore non corretta, la quale faceva bloccare lo script.
Qualche giorno ancora di test e ti farò sapere, ma ormai è da 4 giorni che funziona senza problemi!
Grazie mille!! :D :D :D
Gimli[2BV!2B]
18-10-2013, 20:09
Bene, prego! :)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.