Я полагаю, вы ожидали получить pid процесса screen в $ PID. То, что происходит, - то, что экран немедленно выходит, и $! относится к pid процесса исчезнувшего экрана, а не к отдельному процессу, который выполняет вашу команду mono (если она все еще выполняется).
Я заменил "sleep 2000 &" на "screen -dmS $ {BASENAME}" mono $ {BINARYNAME}> / dev / null & "в вашем скрипте, и правильный $ PID, который был в процессе сна, был сохранен в переменной и действовал. Это не происходит с экраном по причине, описанной выше.
Возможно, вы захотите обработать вывод «screen -list», чтобы получить pid отдельного процесса:
root@tutorial:/var/tmp# screen -dmS 'sleeper' sleep 2000
root@tutorial:/var/tmp# screen -list
There is a screen on:
7089.sleeper (07/02/2018 04:05:57 AM) (Detached)
1 Socket in /var/run/screen/S-root.
root@tutorial:/var/tmp# ps axlww | grep 7089
5 0 7089 1 20 0 25672 2396 poll_s Ss ? 0:00 SCREEN -dmS sleeper sleep 2000
4 0 7090 7089 20 0 5808 648 hrtime Ss+ pts/0 0:00 sleep 2000
0 0 7093 2607 20 0 12728 2192 pipe_w S+ ttyS1 0:00 grep 7089
Отсюда ваш сценарий может захватить пижаму спящего.