Bạn có thể thiết lập một vòng lặp chạy trong nền để định kỳ thực hiện "sudo -v", mẹo tất nhiên là làm cho vòng lặp kết thúc một cách sạch sẽ khi tập lệnh của bạn kết thúc. Vì vậy, phải có một số loại giao tiếp giữa hai quá trình; Các tập tin tmp là tốt cho điều này, và chúng cũng có thể dễ dàng được dọn sạch sau khi tập lệnh chạy. (Một kịch bản cài đặt thường làm điều này, dù sao đi nữa.)
Ví dụ: (loại bỏ các câu lệnh 'echo' để sử dụng điều này; chúng chỉ hiển thị "đang hoạt động"):
#!/bin/bash
log=running_setup.txt
sudo_stat=sudo_status.txt
echo "========= running script $$ ========"
echo $$ >> $sudo_stat
trap 'rm -f $sudo_stat >/dev/null 2>&1' 0
trap "exit 2" 1 2 3 15
sudo_me() {
while [ -f $sudo_stat ]; do
echo "checking $$ ...$(date)"
sudo -v
sleep 5
done &
}
echo "=setting up sudo heartbeat="
sudo -v
sudo_me
echo "=running setup=" | tee $log
while [ -f $log ]
do
echo "running setup $$ ...$(date) ===" | tee -a $log
sleep 2
done
# finish sudo loop
rm $sudo_stat
Sau đó, bạn sẽ thấy ... (lưu ý: pid được đưa vào tệp tmp, để bạn có thể dễ dàng giết nó. Tuy nhiên, điều đó không cần thiết):
$ ./do_it.sh
========= running script 6776 ========
=setting up sudo heartbeat=
[sudo] password for user:
=running setup=
checking 6776 ...Wed May 4 16:31:47 PDT 2011
running setup 6776 ...Wed May 4 16:31:48 PDT 2011 ===
running setup 6776 ...Wed May 4 16:31:50 PDT 2011 ===
running setup 6776 ...Wed May 4 16:31:52 PDT 2011 ===
checking 6776 ...Wed May 4 16:31:53 PDT 2011
running setup 6776 ...Wed May 4 16:31:54 PDT 2011 ===
<ctrl-c> (cleans up files, then exits)