답변:
불쾌한 해킹 없이이 작업을 수행 할 수 없습니다-API가 없으며 환경이 변경되었음을 프로세스에 알리는 방법이 없습니다 (어쨌든 실제로는 불가능하기 때문에).
그렇게해도 관리가 효과가 있는지 확신 할 수있는 방법은 없습니다. 프로세스는 찌르려고하는 환경 변수를 캐시 할 수 있습니다 (아무것도 바꿀 수 없기 때문에) ).
정말로 이것을하고 싶고 일이 잘못되면 조각을 집을 준비가되면 디버거를 사용할 수 있습니다. 예를 들어이 스택 오버플로 질문 :
다른 프로세스의 환경 변수를 변경하는 방법이 있습니까?
본질적으로 :
(gdb) attach process_id
(gdb) call putenv ("DISPLAY=your.new:value")
(gdb) detach
호출 할 수있는 다른 가능한 기능은 setenv
또는 unsetenv
입니다.
대상 프로세스가 환경 블록과 관련하여 "흥미로운"작업을 수행 할 경우 이것이 작동하지 않거나 심각한 결과를 초래할 수 있음을 명심하십시오. 중요하지 않은 프로세스에서 먼저 테스트를 수행하되, 이러한 테스트 프로세스는 찌르려고하는 프로세스와 최대한 가깝게 미러링해야합니다.
배치 작업이 파일 시스템에서 변경 사항을 검색하기 위해 읽을 수있는 경우에는 그렇게 할 필요가 없습니다. 임시 고유 디렉토리에 대한 경로가있는 작업을 실행하고 동일한 경로를 하위 쉘 스크립트에 전달하십시오. 스크립트는 해당 디렉토리의 파일을 잠그고 잠금 파일 근처에 새로운 값을 가진 파일을 작성합니다. 작업 스크립트는 때때로 동일한 파일을 잠그고 값 파일에서 변경 사항을 구문 분석하고 다시 읽습니다. 유닉스 쉘에서 잠금을 만드는 방법을 찾으려면 unix shell lock file
또는을 검색하면 bash lock file
이미 그에 대한 많은 솔루션이 있습니다.
이 솔루션의 장점 :
아래의 구현 문제 :
flock
Linux에서는 제외 효과를 달성하기 위해 Windows에는 기본적으로 제외가 있음)구현은 여기에 저장됩니다 : https://sourceforge.net/p/contools/contools/HEAD/tree/trunk/Scripts/Tools
그만큼 bash
구현 :
set_vars_from_locked_file_pair.sh
#!/bin/bash
# Another variant of a configuration file variables read and set script.
# The script must stay as simple as possible, so for this task it uses these parameters:
# 1. path where to lock a lock file
# 2. path where to read a file with variable names (each per line)
# 3. path where to read a file with variable values (each per line, must be the same quantity of lines with the variable names file)
# Script can be ONLY included by "source" command.
if [[ -n "$BASH" && (-z "$BASH_LINENO" || ${BASH_LINENO[0]} -gt 0) ]]; then
function set_vars_from_locked_file_pair()
{
# the lock file directory must already exist
if [[ ! -d "${1%[/\\]*}" ]]; then
echo "$0: error: lock file directory does not exist: \`${1%[/\\]*}\`" >&2
return 1
fi
if [[ ! -f "${2//\\//}" ]]; then
echo "$0: error: variable names file does not exist: \`$2\`" >&2
return 2
fi
if [[ ! -f "${3//\\//}" ]]; then
echo "$0: error: variable values file does not exist: \`$3\`" >&2
return 3
fi
function LocalMain()
{
# open file for direct reading by the `read` in the same shell process
exec 7< "$2"
exec 8< "$3"
# cleanup on return
trap "rm -f \"$1\" 2> /dev/null; exec 8>&-; exec 7>&-; trap - RETURN" RETURN
local __VarName
local __VarValue
# shared acquire of the lock file
while :; do
# lock via redirection to file
{
flock -s 9
# simultaneous iteration over 2 lists in the same time
while read -r -u 7 __VarName; do
read -r -u 8 __VarValue
# drop line returns
__VarName="${__VarName//[$'\r\n']}"
__VarValue="${__VarValue//[$'\r\n']}"
# instead of `declare -gx` because `-g` is introduced only in `bash-4.2-alpha`
export $__VarName="$__VarValue"
(( ${4:-0} )) && echo "$__VarName=\`$__VarValue\`"
done
break
# return with previous code
} 9> "$1" 2> /dev/null # has exclusive lock been acquired?
# busy wait
sleep 0.02
done
}
LocalMain "${1//\\//}" "${2//\\//}" "${3//\\//}" "${4:-0}"
}
fi
testlock.sh
#!/bin/bash
{
flock -x 9 2> /dev/null
read -n1 -r -p "Press any key to continue..."
echo >&2
} 9> "lock"
이식성에 대한 예로 Windows에서도 동일합니다.
set_vars_from_locked_file_pair.bat
@echo off
rem Another variant of a configuration file variables read and set script.
rem The script must stay as simple as possible, so for this task it uses these parameters:
rem 1. path where to lock a lock file
rem 2. path where to read a file with variable names (each per line)
rem 3. path where to read a file with variable values (each per line, must be the same quantity of lines with the variable names file)
rem disable alternative variables expansion to avoid `!` character consumption
setlocal DISABLEDELAYEDEXPANSION
set "FILE_LOCK_PATH=%~1"
set "FILE_VAR_NAMES_PATH=%~2"
set "FILE_VAR_VALUES_PATH=%~3"
set "PRINT_VARS_SET=%~4"
set "FILE_LOCK_DIR=%~d1"
rem the lock file directory must already exist
if not exist "%FILE_LOCK_DIR%" (
echo.%~nx0: error: FILE_LOCK_DIR does not exist: "%FILE_LOCK_DIR%"
exit /b 1
) >&2
if not exist "%FILE_VAR_NAMES_PATH%" (
echo.%~nx0: error: FILE_VAR_NAMES_PATH does not exist: "%FILE_VAR_NAMES_PATH%"
exit /b 2
) >&2
if not exist "%FILE_VAR_VALUES_PATH%" (
echo.%~nx0: error: FILE_VAR_VALUES_PATH does not exist: "%FILE_VAR_VALUES_PATH%"
exit /b 3
) >&2
rem The endlocal works only in the same call context
endlocal
rem exclusive acquire of the lock file
:REPEAT_LOCK_LOOP
(
(
rem if lock is acquired, then we are in...
call :MAIN "%%~2" "%%~3" "%%~4"
call set "LASTERROR=%%ERRORLEVEL%%"
rem exit with return code from the MAIN
) 9> "%~1" && (del /F /Q /A:-D "%~1" & goto EXIT)
) 2>nul
rem Busy wait: with external call significantly reduces CPU consumption while in a waiting state
pathping localhost -n -q 1 -p 20 >nul 2>&1
goto REPEAT_LOCK_LOOP
:EXIT
exit /b %LASTERROR%
:MAIN
rem drop last error
type nul>nul
if %~30 NEQ 0 goto SET_WITH_PRINT
rem trick with simultaneous iteration over 2 lists in the same time
(
for /f "usebackq eol=# tokens=* delims=" %%i in ("%~1") do (
set /p "%%i="
)
) < "%~2"
exit /b 0
:SET_WITH_PRINT
rem trick with simultaneous iteration over 2 lists in the same time
(
for /f "usebackq eol=# tokens=* delims=" %%i in ("%~1") do (
set /p "%%i="
rem to filter out wrong matches of a variable from the `set "%%i"`
for /f "usebackq eol=# tokens=1,* delims==" %%j in (`set "%%i"`) do if /i "%%j" == "%%i" echo.%%i=%%k
)
) < "%~2"
exit /b 0
testlock.bat
@echo off
(
pause
) 9> ./lock
파일을 작성하려면 동일한 방식으로 코드를 잠그십시오.
xpra
흥미로울 수 있습니다.