Cách đây một thời gian tôi đã viết một kịch bản để chờ kết thúc một quá trình khác. NOISE_CMD
có thể là một cái gì đó như notify-send ...
, cho rằng DISPLAY
được đặt chính xác.
#!/bin/bash
NOISE_CMD="/usr/bin/mplayer -really-quiet $HOME/sfx/alarm-clock.mp3"
function usage() {
echo "Usage: $(basename "$0") [ PROCESS_NAME [ PGREP_ARGS... ] ]"
echo "Helpful arguments to pgrep are: -f -n -o -x"
}
if [ "$#" -gt 0 ] ; then
PATTERN="$1"
shift
PIDS="$(pgrep "$PATTERN" "$@")"
if [ -z "$PIDS" ] ; then
echo "No process matching pattern \"$PATTERN\" found."
exit
fi
echo "Waiting for:"
pgrep -l "$PATTERN" "$@"
for PID in $PIDS ; do
while [ -d "/proc/$PID" ] ; do
sleep 1
done
done
fi
exec $NOISE_CMD
Không có bất kỳ tranh luận, chỉ cần làm cho một số tiếng ồn ngay lập tức. Hành vi này cho phép một cái gì đó như thế này cho thuận tiện (giả sử bạn gọi tập lệnh bên dưới alarm.sh
):
apt-get upgrade ; ~/bin/alarm.sh
Tất nhiên bạn có thể làm nhiều điều thú vị với một kịch bản như vậy, như để một ví dụ alarm.sh
chờ đợi một ví dụ alarm.sh
, đó là chờ một số lệnh khác. Hoặc thực thi lệnh ngay sau khi một số tác vụ của người dùng đã đăng nhập khác kết thúc ...>: D
Một phiên bản cũ của tập lệnh ở trên có thể rất thú vị, nếu bạn muốn tránh sự phụ thuộc pgrep
và chấp nhận tự tìm kiếm ID quá trình:
#!/bin/bash
if [ "$#" -lt 2 -o ! -d "/proc/$1" ] ; then
echo "Usage: $(basename "$0") PID COMMAND [ ARGUMENTS... ]"
exit
fi
while [ -d "/proc/$1" ] ; do
sleep 1
done
shift
exec "$@"
Hơi lạc đề, nhưng hữu ích trong các tình huống tương tự: Người ta có thể quan tâm reptyr
, một công cụ "đánh cắp" một quy trình từ một số vỏ (cha mẹ) và chạy nó từ vỏ hiện tại. Tôi đã thử thực hiện tương tự và reptyr
là đẹp nhất và đáng tin cậy nhất cho mục đích của tôi.