Русское войско было рассредоточено по многим пунктам, откуда ожидалось вторжение неприятеля. Сам царь со значительным по численности отрядом остановился в Старице, не рискнув идти навстречу шедшей к Пскову польской армии.
Когда царь узнал о вторжении Стефана Батория, к Пскову было направлено войско князя Ивана Шуйского, назначенного «большим воеводой». Ему подчинялись семь других воевод. Все жители Пскова и гарнизон были приведены к присяге, что не сдадут город, а будут драться до последней капли крови. Общая численность русских войск, оборонявших Псков, достигала 25 тысяч человек и была примерно вдвое меньше численности армии Батория. По приказу Шуйского, окрестности Пскова были опустошены, чтобы неприятель не мог найти там фураж и продовольствие.
18 августа польское войско подошло к городу на расстояние 2–3 пушечных выстрелов. В течение недели Баторий вел разведку русских укреплений и только 26 августа приказал своей армии подступить к городу. Однако солдаты вскоре попали под огонь русских пушек и отступили к реке Череха. Здесь Баторий устроил укрепленный лагерь.
Поляки стали рыть траншеи и ставить туры, чтобы приблизиться к стенам крепости. В ночь с 4 на 5 сентября они подкатили туры к Покровской и Свиной башням на южном фасе стен и, поставив 20 орудий, с утра 6 сентября начали обстреливать обе башни и 150 м стены между ними. К вечеру 7 сентября башни были сильно повреждены, а в стене образовался пролом шириной 50 м. Но осажденные успели соорудить против пролома новую деревянную стену.
8 сентября польские войска пошли на штурм. Атакующим удалось захватить обе поврежденные башни. Однако выстрелами из большой пушки «Барс», способной посылать ядра на расстояние более 1 км, занятая поляками Свиная башня была разрушена. Затем ее развалины русские взорвали, подкатив бочки с порохом. Взрыв послужил сигналом к контратаке, которую возглавил сам Шуйский. Неприятель не смог удержать и Покровскую башню — и отступил.
После неудачи штурма Баторий приказал вести подкопы, чтобы взорвать стены. Два подкопа русским удалось уничтожить с помощью минных галерей, остальные поляки так и не смогли довести до конца. 24 октября польские батареи стали обстреливать Псков из-за реки Великой раскаленными ядрами, чтобы вызвать пожары, но защитники города быстро справились с огнем. Через четыре дня польский отряд с ломами и кирками подошел к стене со стороны Великой между угловой башней и Покровскими воротами и разрушил подошву стены. Она обрушилась, однако оказалось, что за этой стеной есть еще одна стена и ров, которую поляки преодолеть не смогли. Осажденные бросали им на головы камни и горшки с порохом, лили кипяток и смолу.
2 ноября армия Батория предприняла последний штурм Пскова. На этот раз поляки атаковали западную стену. До этого в течение пяти дней она подвергалась мощному обстрелу и в нескольких местах оказалась разрушена. Однако защитники Пскова встретили противника сильным огнем, и поляки повернули обратно, так и не дойдя до проломов.
К тому времени моральный дух осаждающих заметно упал. Но и осажденные испытывали немалые трудности. Основные силы русской армии в Старице, Новгороде и Ржеве бездействовали. В Псков попытались прорваться только два отряда стрельцов по 600 человек, но из них больше половины погибло или попало в плен.
6 ноября Баторий убрал орудия с батарей, прекратил осадные работы и стал готовиться к зимовке. Одновременно он послал отряды немцев и венгров захватить Псково-Печерский монастырь в 60 км от Пскова, однако гарнизон из 300 стрельцов при поддержке монахов успешно отбил два приступа, и неприятель вынужден был отступить.
Стефан Баторий, убедившись, что Псков ему не взять, в ноябре передал командование гетману Замойскому, а сам отбыл в Вильну, забрав с собой почти всех наемников. В результате численность польского войска уменьшилась почти вдвое — до 26 тысяч человек. Осаждающие страдали от холодов и болезней, росло число умерших и дезертирство. В этих условиях Баторий согласился на десятилетнее перемирие. Оно было заключено в Яме-Запольском 15 января 1582 года. Русь отказывалась от всех своих завоеваний в Ливонии, а поляки освобождали занятые ими русские города.
В 1583 году было подписано Плюсское перемирие со Швецией. К шведам переходили Ям, Копорье и Ивангород. За Русью оставался лишь небольшой участок балтийского побережья в устье Невы. Однако в 1590 году после истечения срока перемирия боевые действия между русскими и шведами возобновились и проходили на этот раз успешно для Москвы. В результате по Тявзинскому договору о «вечном мире» Русь вернула себе Ям, Копорье, Ивангород и Корельский уезд. Но это было лишь слабым утешением. В целом попытка Ивана Грозного укрепиться на Балтике потерпела провал.