Timeouts in expect script


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Timeouts in expect script
# 1  
Old 02-01-2012
Timeouts in expect script

Hi all.
I have an expect script which for walks across servers, checks freespace and provides sorted list of biggest files

Code:
#!/usr/bin/expect --
set timeout 600
stty -echo
log_user 0
spawn -noecho sudo -u introot /home/introot/bin/twssh [lindex $argv 0]
expect root
send_user "Entering [lindex $argv 0]\r"
send "uname\r"
log_user 1
expect "Linux" {send "for i in `df -lPh |sed s/\%// |sed '1d' |awk '{if (\$(NF-1) >= 88) print \$NF}'`; do echo \" \$i has `df -hlP \$i | tail -1 | awk '{print \$2, of space,\$(NF-1)}'` is full\" && find \$i -xdev -type f -size +10000k -exec stat -c\"%U %n %s\" {} \\; | sort -nrk 3 | head -40; done\r"
} "SunOS" {send "for i in `df -kl |sed s/\%// |sed '1d' |awk '{if (\$(NF-1) >= 88) print \$NF}'`; do echo \" \$i has `df -kl \$i | tail -1 | awk '{print \$2, of space,\$(NF-1)}'` is full\" && find \$i -xdev -type f -size +10000k -exec ls -l {} \\; | sort -nrk 5 | head -40; done\r"
}
expect eof

The problem is with timeout:
- if it too short then sometimes expect does wait till find and sort commands finish
- if it too long then i have to wait for a while on each host.

Pls advise

---------- Post updated at 12:13 AM ---------- Previous update was at 12:00 AM ----------

There is a typo, i mean "if timeout is too short then sometimes expect does NOT wait till find and sort commands finish"
# 2  
Old 02-01-2012
use 'set timeout -1'. This will make script not to time out and script will come out as soon as it done.
# 3  
Old 02-05-2012
If timeout is set to -1, expect NEVER waits output of find and exits immidiately
# 4  
Old 02-05-2012
Quote:
- if it too long then i have to wait for a while on each host.
I think the issue here is that the wait eof is never getting an eof.

You should insert send "exit\r" before your last expect eof:
Code:
...
}
send "exit\r"
expect eof

Then set the timeout long enough for the longest time you ever expect a command to take (plus a 20% saftey factor, eg set timeout 2000). Also consider using a different timeout for command prompt to eof as prompt should come back much sooner than eof after exit is issued.
# 5  
Old 02-05-2012
It works great on Solaris, but on Linux boxes the output of find is flushed immidiately after script finished. I dont see this output even in my screen's buffer (it is large enough to store this output). Adding "sleep 5" before send "exit\r" didn't help. I see only one possible solution - redirect output into file and parse it after, but i am expecting to use this script interactively (i need to paste output in mails) and i guess there may be a much easier way to resolve this, doesn't it?
# 6  
Old 02-05-2012
This thread:

https://www.unix.com/shell-programmin...solutions.html

Might give you some pointers to writing results to file and expect buffer sizes.
# 7  
Old 02-05-2012
I amended my script as you proposed in above thread, now it looks so:
Code:
#!/usr/bin/expect --
set timeout 600
match_max 10000
stty -echo
log_user 0
spawn -noecho sudo -u introot /home/introot/bin/twssh [lindex $argv 0]
expect root
send_user "Entering [lindex $argv 0]\r"
send "uname\r"
log_user 1
expect "Linux" {send "for i in `df -lPh |sed s/\%// |sed '1d' |awk '{if (\$(NF-1) >= 88) print \$NF}'`; do echo \" \$i has `df -hlP \$i | tail -1 | awk '{print \$2, of space,\$(NF-1)}'` is full\" && find \$i -xdev -type f -size +10000k -exec stat -c\"%U %n %s\" {} \\; | sort -nrk 3 | head -40; done\r"
} "SunOS" {send "for i in `df -kl |sed s/\%// |sed '1d' |awk '{if (\$(NF-1) >= 88) print \$NF}'`; do echo \" \$i has `df -kl \$i | tail -1 | awk '{print \$2, of space,\$(NF-1)}'` is full\" && find \$i -xdev -type f -size +10000k -exec ls -l {} \\; | sort -nrk 5 | head -40; done\r"
}
send "exit\r"
set NewLineChar "\r"
expect {
    $NewLineChar { append dbscntl $expect_out(buffer); exp_continue}
    eof { append dbscntl $expect_out(buffer) }
}
puts $dbscntl

Like before, I see output just for second on Linux, then screen flushed and i see only "Connection to hostname.localnet closed."
In comparsion with earlier ouputs one empty line was added. So $dbscntl remains empty because "expect eof" never works for me
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Programming

Expect script returning string following a found expect.

I'm fairly new to scripting so this might not be possible. I am using Expect with Cisco switches and need to capture the string after finding the expect request. For example, when I issue "show version" on a Nexus switch, I'm looking to capture the current firmware version: #show version ... (0 Replies)
Discussion started by: IBGaryA
0 Replies

2. IP Networking

Problems and doubts with sockets and timeouts

Hi! I need some help to understand a little bit more the behaviour about socket and TCP connections... Here is my problem I have a client and a server that were written in python. The server program wait until a message arrive and then print the message but if the message not arrive in a second... (2 Replies)
Discussion started by: Kovalevski
2 Replies

3. Shell Programming and Scripting

SFTP or scp with password in a batch script without using SSH keys and expect script

Dear All, I have a requirement where I have to SFTP or SCP a file in a batch script. Unfortunately, the destination server setup is such that it doesn't allow for shell command line login. So, I am not able to set up SSH keys. My source server is having issues with Expect. So, unable to use... (5 Replies)
Discussion started by: ss112233
5 Replies

4. Programming

Calling another expect script inside an expect script

I have an expect script called remote that I want to call from inside my expect script called sudoers.push, here is the code that is causing me issues: set REMOTE "/root/scripts/remote" ... log_user 1 send_user "Executing remote script as $user...\n" send_user "Command to execute is: $REMOTE... (1 Reply)
Discussion started by: brettski
1 Replies

5. Programming

Calling expect script inside another expect

Hi, Am very new to expect scripting.. Can You please suggest me how to call an expect script inside another expect script.. I tried with spawn /usr/bin/ksh send "expect main.exp\r" expect $root_prompt and spawn /usr/bin/ksh send "main.exp\r" expect $root_prompt Both... (1 Reply)
Discussion started by: Priya Amaresh
1 Replies

6. Shell Programming and Scripting

Need help with Expect script for Cisco IPS Sensors, Expect sleep and quoting

This Expect script provides expect with a list of IP addresses to Cisco IPS sensors and commands to configure Cisco IPS sensors. The user, password, IP addresses, prompt regex, etc. have been anonymized. In general this script will log into the sensors and send commands successfully but there are... (1 Reply)
Discussion started by: genewolfe
1 Replies

7. Shell Programming and Scripting

strange expect script behavior, or am i misunderstanding expect scripting?

Hello to all...this is my first post (so please go easy). :) I feel pretty solid at expect scripting, but I'm running into an issue that I'm not able to wrap my head around. I wrote a script that is a little advanced for logging into a remote Linux machine and changing text in a file using sed.... (2 Replies)
Discussion started by: v1k0d3n
2 Replies

8. UNIX for Advanced & Expert Users

Facing file processing timeouts

Hi In our ETL application we have used simple scripts to move & split the files. We are randomly facing timeouts on these jobs. It indicates we are running out of resources. How should I confirm the resources are inadequate? I know we have commands like vmstat & iostat which displays... (3 Replies)
Discussion started by: videsh77
3 Replies

9. UNIX for Dummies Questions & Answers

Device Timeouts on Unix Server

Hi I am brand new to the forum I have very limited understanding of unix, but am very computer literate. At work we have a unix server which has been the bane of our lives. We have stopped being able to access the network drives and the screen has lots of device timeouts. I have learned how to do... (1 Reply)
Discussion started by: scovell01
1 Replies

10. Cybersecurity

UNIX Network timeouts

Hi, can anyone point me in the right direction regarding a UNIX setting that determines when a network connection will timeout? I am getting network timeouts and I would like to know if there is a setting in UNIX 11i OS that I can modify to increase the time limit. Thank you (4 Replies)
Discussion started by: Allano
4 Replies
Login or Register to Ask a Question