ฉันมีสคริปต์ไปที่:
เรียกใช้คำสั่งโดยพลการในพื้นหลัง
หยุดพวกเขาจากการถูกฆ่าด้วยหน้าต่างเทอร์มินัล
ปราบปรามการส่งออกของพวกเขา
จัดการสถานะทางออก
ฉันจะใช้มันเป็นหลักสำหรับgedit
, evince
, inkscape
ฯลฯ ที่ทุกคนมีจำนวนมากของการส่งออกขั้วที่น่ารำคาญ หากคำสั่งเสร็จสิ้นก่อนหน้าTIMEOUT
นี้สถานะการออกของ nohup จะถูกส่งคืนแทนที่จะเป็นศูนย์
#!/bin/bash
TIMEOUT=0.1
#use nohup to run the command, suppressing its output and allowing the terminal to be closed
#also send nohup's output to /dev/null, supressing nohup.out
#run nohup in the background so this script doesn't block
nohup "${@}" >/dev/null 2>&1 &
NOHUP_PID=$!
#kill this script after a short time, exiting with success status - command is still running
#this is needed as there is no timeout argument for `wait` below
MY_PID=$$
trap "exit 0" SIGINT SIGTERM
sleep $TIMEOUT && kill $MY_PID 2>/dev/null & #ignore "No such process" error if this exits normally
#if the command finishes before the above timeout, everything may be just fine or there could have been an error
wait $NOHUP_PID
NOHUP_STATUS=$?
#print an error if there was any. most commonly, there was a typo in the command
[ $NOHUP_STATUS != 0 ] && echo "Error ${@}"
#return the exit status of nohup, whatever it was
exit $NOHUP_STATUS
ตัวอย่าง...
>>> run true && echo success || echo fail
success
>>> run false && echo success || echo fail
Error false
fail
>>> run sleep 1000 && echo success || echo fail
success
>>> run notfound && echo success || echo fail
Error notfound
fail