昨晩
ハマりつつ死亡。
#!/usr/bin/gosh (use gauche.process) (use util.match) (define (snmp-port-check l) (if (null? l) #f (match (string-split (car l) char-whitespace?) ((_ _ _ "127.0.0.1:161" _) #t) (else (snmp-port-check (cdr l)))))) (define (port-check) (let ((x (process-output->string-list '(netstat -n --all)))) (snmp-port-check x))) (define main (lambda (args) (if (port-check) 0 1)))
上記、snmpd なサービスが起動されててもシェルには真が戻ってこない。ちなみに同様なソレを gosh 上で試験すると正常動作。
gosh> snmp ("udp 0 0 127.0.0.1:161 0.0.0.0:*") gosh> (define l (string-split (car snmp) char-whitespace?)) l gosh> l ("udp" "0" "0" "127.0.0.1:161" "0.0.0.0:*") gosh> (match l ((_ _ _ "127.0.0.1:161" _) #t) (else #f)) #t gosh>
どうヤッたものか ...
確認事項
- string-split したリストの要素を string? したら戻りは #t なので文字列
そういえば Gauche 本にデバッグなナニが出てたな。
で、デバッグプリント使って以下。
#!/usr/bin/gosh (use gauche.process) (use util.match) (define (snmp-port-check l) (if (null? l) #f ;; (match (string-split (car l) char-whitespace?) (let ((x (string-split (car l) char-whitespace?))) (match #?=x ((_ _ _ "127.0.0.1:161" _) #t) (else (snmp-port-check (cdr l)))))) ) (define (port-check) (let ((x (process-output->string-list '(netstat -n --all)))) (snmp-port-check x))) (define main (lambda (args) (if (port-check) 0 1)))
出力の一部が以下ッス。
#?=x #?- ("udp" "0" "0" "127.0.0.1:161" "0.0.0.0:*" "")
なるほど。一つ多いのか ... (とほほほ
# これは分からんよ
match を以下のカンジにして解決。
(define (snmp-port-check l) (if (null? l) #f (match (string-split (car l) char-whitespace?) ((_ _ _ "127.0.0.1:161" _ _) #t) (else (snmp-port-check (cdr l))))))